2

给定以下类型层次结构:

@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;
}

现在我想用 C 类型的“a”查询所有 D 类型的记录,并且字段“c”等于给定的字符串参数:

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

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

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

4

1 回答 1

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));
于 2013-07-09T16:47:45.647 回答