JPA / Hibernate查询多态字段

时间:2013-05-16 10:15:26

标签: 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'等于给定的字符串参数:

...
Root<D> root
CriteriaBuilder cb
cb.equal(root.get("a").get("c").as(String.class), "Test");
...

在可预见的情况下,我会得到一个异常,告诉我属性'c'是未知的,因为它没有在超类型A中定义。

任何想法,如何告诉JPA Query它应该只在C中为字段'a'加入C并在字段'c'中添加条件?

1 个答案:

答案 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));