エンティティがあるとします
@Entity
public class Test {
@ManyToMany
@JoinTable(..etc..)
private List<Subject> subjects; // School subjects this test is associated with
....
そしてエンティティ
@Entity
public class Exam extends Test {
// Inherits subjects from test
// Does some things specific to exams
...
Exam
そして、特定の に関連付けられた のみを取得する基準クエリ (メタモデルを使用) を作成したいと考えていますSubject
。私の質問は、このクエリをどのように書くのですか?
私が試したことは次のとおりです。
私が書いたら
CriteriaBuilder cb = em.getCriteriaBuilder(); // em is the EntityManager
CriteriaQuery<Exam> cq = cb.createQuery(Exam.class);
Root<Exam> root = cq.from(Exam.class);
cq.where(cb.isMember(subject, root.get(Exam_.subjects)));
return em.createQuery(cq);
コンパイラはそれをコンパイルしませんerror: no suitable method found for get(ListAttribute<Test,Subject>)
。直観的にはこれが解決策であるかのように感じますが、継承は十分ではありません。クエリでメタモデル参照を省略して に置き換えても機能しませんroot.get("subjects")
。
私が書いたら
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Exam> cq = cb.createQuery(Exam.class);
Root<Test> root = cq.from(Test.class);
cq.where(cb.isMember(subject, root.get(Exam_.subjects)));
return em.createQuery(cq);
これは間違っているように感じますが、コンパイルされます。ただし、実際にコードを実行すると、例外が表示されます。IllegalStateException: No explicit selection and an implicit one could not be determined
これは、 の型をジャグリングした結果として解釈しRoot
ます。試しroot.get(Test_.subjects)
ても同じ結果になります。
私は JPA 実装として Hibernate を使用していますが、JPA Criteria Queries に固執しようとしています。