CriteriaQuerry | GroupBy root.type()

0

Problem: Pogrupować encje ze względu na ich typ przez criteriaQuerry (klasa bazowa ma X dzieciorów). Oczekiwany rezultat Map<Class<?>, List<Czegoś>>
Notka: Musiałem gdzieniegdze poukrywać nazwy

Mamy :

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
abstract class BaseSomething : BaseMoreSth() {
    var name: String? = null

    @OneToMany(mappedBy = "enumEntity", cascade = [CascadeType.MERGE, CascadeType.PERSIST], orphanRemoval = true, fetch = FetchType.EAGER)
    var translations: MutableList<Translations> = ArrayList()
}

Ta klasa wyżej ma z 3-4 dziecioki dziedziczące (dokładnie nie wiem bo to nie mój kod, jedynie chcę pomóc)

Podejście które nie działa (już po x modyfikacjach )

     override fun getAllGrouped(): MutableList<Tuple> {
        val criteriaBuilder: CriteriaBuilder = entityManager.criteriaBuilder
        val criteriaQuery: CriteriaQuery<Tuple> = criteriaBuilder.createTupleQuery()
        val root: Root<BaseSomething> = criteriaQuery.from(BaseSomething::class.java)
       // val expressionClazz: Expression<BaseSomething> = root.get("DTYPE")
       // val expressionClazz: Expression<BaseSomething> = root.get("clazz_")
        criteriaQuery.groupBy(
/*            root.get(BaseSomething_.id),
            root.get(BaseSomething_.version),
            root.get(BaseSomething_.timestamp),*/
            root.type(),
            root.get(BaseSomething_.name))
        criteriaQuery.multiselect(root.type(),  root.get(BaseSomething_.name))

        return entityManager.createQuery(criteriaQuery).resultList 

EX:

 class org.hibernate.hql.internal.ast.tree.NullNode cannot be cast to class org.hibernate.hql.internal.ast.tree.FromReferenceNode (org.hibernate.hql.internal.ast.tree.NullNode and org.hibernate.hql.internal.ast.tree.FromReferenceNode are in unnamed module of loader 'app')

Zapytanie jakie Hibernate tworzy :

        select
        hidden_by_me_.name as col_0_0_,
        hidden_by_me.id as col_1_0_,
        hidden_by_me.id as id1_5_,
        hidden_by_me.timestamp as timestam2_5_,
        hidden_by_me.version as version3_5_,
        hidden_by_me.name as name4_5_,
        hidden_by_me.clazz_ as clazz_ 
    from
        ( select
            id,
            timestamp,
            version,
            name,
            1 as clazz_ 
        from
            child_1 
        union
        all select
            id,
            timestamp,
            version,
            name,
            2 as clazz_ 
        from
            child_2 
        union
        all select
            id,
            timestamp,
            version,
            name,
            3 as clazz_ 
        from
            child_3 
        union
        all select
            id,
            timestamp,
            version,
            name,
            4 as clazz_ 
        from
            child_4 
    ) hidden_by_me

W zapytaniu z predicate-em root.type() potrafi wyciagnąc informacje na temat konkretnych instancji klasy bazowej, w groupBy niekoniecznie to idzie
Ktoś potrafi polecić jak do tego podejść? Możliwie miłoby było uniknąć streamów po całej liście zwracanej z bazy i dopiero wtedy grupować.

1

Jak chcesz mistrzowso świata (albo przynajmniej Eurowizji) w skomplikowanych kwerendach, to rób to w SQL - JPA tylko przeszkadza, wynik sobie zmapuj na obiekty czymś prosty i voila

0

Ja spytam, czemu to robisz korzystając z CriteriaQuery?

CriteriaQuery służy do budowy SQLa, który zbyt dużego pojęcia o klasach Javowych nie ma. Być może da się to zrobić w ten sposób, ale jakoś tego nie widzę. Wyciągnij dane w liście i zrób groupBy poza query i tyle.

1 użytkowników online, w tym zalogowanych: 0, gości: 1