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' とフィールド 'c' が特定の文字列パラメーターに等しい、タイプ D のすべてのレコードをクエリしたいと思います。

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

予想通り、属性「c」はスーパータイプ A で定義されていないため、不明であるという例外が発生します。

JPAクエリに、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 に答える