Spring Data a projekce

Pokud pro dotazování používáte Spring Data, v rámci výsledku dostanete root entitu (všechny její hodnoty). Pokud tedy budete mít následující entitu:

@Entity
@Table(name = "t_book")
@SequenceGenerator(initialValue = 100, name = "t_book_seq_gen", sequenceName = "t_book_seq")
class BookEntity (
        @Id
        @GeneratedValue(generator = "t_book_seq_gen", strategy = GenerationType.SEQUENCE)
        var id: Long = 0L,

        var author: String = "",

        var publisher: String = "",

        var title: String = "",

        var foreword: String = "",

        var numberOfPages: Int = 0,

        var publishingYear: Int = 0
)

vždy získáte všechny hodnoty (id, author, publisher, title, foreword, numberOfPages, …), i když je nebudete vždy potřebovat. Pokud chcete použe některé hodnoty, je zde možnost tzv. projekce. Vytvoříte si rozhraní, které bude obsahovat jen to, co potřebujete. Např. budete chtít pouze titul knihy a počet stran.

interface BaseBookInfo {
    var title: String
    var numberOfPages: Int
}

Repozitory pak bude vypadat následovně:

interface BookRepository: JpaRepository<BookEntity, Long> {
    
    fun findByTitle(title: String): BaseBookInfo?

    @Query("SELECT b.title AS title, b.numberOfPages AS numberOfPages FROM BookEntity b")
    fun findAllInfo(): List<BaseBookInfo>
}

Pokud nyní repozitory zavoláte

val b1 = BookEntity(
        author = "Author 1",
        publisher = "Publisher 1",
        title = "Title 1",
        foreword = "Foreword book 1",
        numberOfPages = 100,
        publishingYear = 2010
)
val b2 = BookEntity(
        author = "Author 2",
        publisher = "Publisher 2",
        title = "Title 2",
        foreword = "Foreword book 2",
        numberOfPages = 200,
        publishingYear = 2020
)
bookRepository.saveAll(listOf(b1, b2))

val bookInfo2 = bookRepository.findByTitle("Title 2")
val allInfo = bookRepository.findAllInfo()

bookInfo2?.let {
    println("${it.title}${it.numberOfPages}")
}
allInfo.forEach { print("${it.title}${it.numberOfPages}\t") }

dostanete tento výsledek

Title 2200
Title 1100	Title 2200

Napsat komentář