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_