Pokud vytváříte dotaz pomocí entity manažera (viz příspěvek Spring Data a vytvárení dotazů pomocí entiy managera) můžete omezit sloupce, které daným dotazem budete vracet. V tomto případě používám tabulku t_order
se sloupci id
, identifier
a sum
, která je v představována entitou Order
.
import java.math.BigDecimal import java.util.* import javax.persistence.* @Entity @Table(name = "t_order") @SequenceGenerator(name = "t_order_seq_gen", sequenceName = "t_order_seq", allocationSize = 1) class Order( @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "t_order_seq_gen") var id: Long = 0L, var identifier: UUID = UUID.randomUUID(), var sum: BigDecimal = BigDecimal.ZERO ) { constructor(identifier: UUID, sum: BigDecimal) : this() { this.identifier = identifier this.sum = sum } }
Všimněte si dalšího dvouparametrického konstruktoru constructor(identifier: UUID, sum: BigDecimal)
.
Klasický dotaz vypadá takto:
fun findAll(): List<Order> { val criteriaBuilder = entityManager.criteriaBuilder val criteriaQuery = criteriaBuilder.createQuery(Order::class.java) val root = criteriaQuery.from(Order::class.java) // tuto část select je možno vynechat criteriaQuery.select(root) val typedQuery: TypedQuery<Order> = entityManager.createQuery(criteriaQuery) val resultList: MutableList<Order> = typedQuery.resultList return resultList }
Výše uvedný kód vygeneruje tento dotaz do databáze:
select order0_.id as id1_4_, order0_.identifier as identifi2_4_, order0_.sum as sum3_4_ from t_order order0_
Nyní omezíme dotaz tak, aby se s databáze vracel jen identifier a sum (vynecháme id).
fun findAll(): List<Order> { val criteriaBuilder = entityManager.criteriaBuilder val criteriaQuery = criteriaBuilder.createQuery(Order::class.java) val root = criteriaQuery.from(Order::class.java) // v tomto případě musíme část select uvést // entity Order musí mít v tomto případě konstruktor, pro identifier a sum criteriaQuery.select(criteriaBuilder.construct(Order::class.java, root.get(Order_.identifier), root.get(Order_.sum))) val typedQuery: TypedQuery<Order> = entityManager.createQuery(criteriaQuery) val resultList: MutableList<Order> = typedQuery.resultList return resultList }
Vygenerovaný select vypadá následovně:
select order0_.identifier as col_0_0_, order0_.sum as col_1_0_ from t_order order0_