Vrácení pouze některých sloupců při vytvoření dotazu pomocí entity manažera

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_

Napsat komentář