多态字段的JPA/Hibernate查询

多态字段的JPA/Hibernate查询,hibernate,jpa,polymorphism,polymorphic-associations,criteria-api,Hibernate,Jpa,Polymorphism,Polymorphic Associations,Criteria Api,给定以下类型层次结构: @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”等于给定

给定以下类型层次结构:

@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");
...
。。。
根
标准生成器cb
cb.equal(root.get(“a”).get(“c”).as(String.class),“Test”);
...
可以预见,我会得到一个异常,告诉我属性“c”是未知的,因为它不是在超类型A中定义的

有什么想法吗?如何告诉JPA查询它应该只为字段“a”在D处加入C,并为字段“C”添加一个条件?

CriteriaQuery q=criteriaBuilder.createTupleQuery();
    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));
根自=q.from(D.class); 连接路径=from.Join(D_u.a); q、 multiselect(path.get(A_u.id)).where(criteriaBuilder.equal(path.type(),C.class));