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