给出以下类型的层次结构:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
class A { }
@Entity
class B extends A {
String b;
}
@Entity
class C extends A {
String c;
}
@Entity
class D {
@ManyToOne
A a;
}
现在我想查询类型D的所有记录,其中'a'的类型为C,字段'c'等于给定的字符串参数:
...
Root<D> root
CriteriaBuilder cb
cb.equal(root.get("a").get("c").as(String.class), "Test");
...
在可预见的情况下,我会得到一个异常,告诉我属性'c'是未知的,因为它没有在超类型A中定义。
任何想法,如何告诉JPA Query它应该只在C中为字段'a'加入C并在字段'c'中添加条件?
答案 0 :(得分:1)
CriteriaQuery<Tuple> q = criteriaBuilder.createTupleQuery();
Root<D> from = q.from(D.class);
Join<D, A> path = from.join(D_.a);
q.multiselect(path.get(A_.id)).where(criteriaBuilder.equal(path.type(), C.class));