У меня есть следующая модель домена с наследованием:
@Entity
class A {
@OneToMany
Set<B> b;
}
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE", discriminatorType = @DiscriminatorType.STRING, length = 3)
abstract class B {
@OneToMany
Set<C> c;
}
@Entity
@DiscriminatorValue("B1")
class B1 extends B {
@OneToMany
Set<C> c;
}
@Entity
@DiscriminatorValue("B2")
class B2 extends B {
}
@Entity
class C {
}
Я хочу построить запрос, который загружает некоторые поля из C следующим образом:
class Dto {
String a;
String b;
String c;
public Dto(String a, String b, String b) {
....
}
}
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery query = cb.createQuery(Dto.class);
Root<A> from = query.from(A.class);
Join<A, B> joinB = from.join(A_.b);
Join<A, B1> joinB1 = cb.treat(joinB, B1.class);
Join<B1, C> joinC = joinB1.join(B1_.c);
q.where(cb.equal(joinC.get(C_.id), cid);
q.select(cb.construct(Dto.class, joinC.get(C_.value), joinB1.get(B1_.value), from.get(A_.value));
e.createQuery(q).getResultList();
Кажется, нельзя использовать обработку в большем количестве объединений, обработка должна быть листовым соединением. см. eclipselink или SO это. Что происходит, так это то, что hibernate (4.3.6, версия, которую я использую) не генерирует псевдоним в запросе jpql.
Я неправильно понял использование оператора Treat?
Есть ли способ обойти это? проблема?