我有以下具有继承的域模型:
@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();
看来,在更多联接中使用treat是不可能的,这种处理必须是叶子连接。
请参阅eclipselink或SO this。
会发生什么是hibernate(4.3.6,我正在使用的版本)不会在jpql查询中生成别名。
我是否误解了对待操作员的使用?
有没有办法解决这个问题?