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ć.