データベースからエンティティを選択するには、JPA2とCriteria APIを併用しています。実装はWebSphere Application ServerのOpenJPAです。すべてのエンティティはFetchtype = Lazyでモデル化されています。jpa基準を持つ複数のレベルでエンティティを遅延フェッチ
データベースからいくつかの基準を持つエンティティを選択し、すべてのネストされたデータをサブテーブルから一度にロードしたいとします。 私はテーブルAをテーブルBにoneToMany接合されたデータモデルを持っている場合、私は私の基準クエリでフェッチ句を使用することができます。これは正常に動作します
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<A> cq = cb.createQuery(A.class);
Root<A> root = cq.from(A.class);
Fetch<A,B> fetch = root.fetch(A_.elementsOfB, JoinType.LEFT);
。私は要素Aを取得し、Bのすべての要素は正しく埋められます。 テーブルBはテーブルCに対してoneToMany関係を持っており、それらもロードします。だから、私は、クエリに次のステートメントを追加します。
Fetch<B,C> fetch2 = fetch.fetch(B_.elementsOfC, JoinType.LEFT);
しかし、これは文句を言わない何かを。
誰かが1つのクエリで複数レベルのエンティティを取得する方法を知っていますか?
お返事ありがとうございます。しかし、あなたが指摘したドキュメントの記事には、JPQLの例があります。 'SELECT x FROM Magazine x join fetch x.articles join fetch a.publishers p WHERE x.title = 'JDJ'' テーブルx、a pは関係x-> aおよびa-> pを持ちます。これはまさに私が基準APIを使ってやりたいことです。 –
あなたはそれを非常に注意深く読まなかった。構文エラーの原因となるクエリの例です。そのクエリの前の文は次のとおりです: "次のクエリは構文エラーになります:"。あなたがしたいことは機能しません。 –
ああ、そうです。ですから私は言うことができます:Ooops。しかし、とにかく...私はそのような問題を解決できる練習はありますか?この世界には2つ以上のテーブルを取りたい人がたくさんいると思う。最初に2番目のテーブルに参加する必要がありますか、または手動で他のデータを読み込む必要がありますか?そのベストプラクティスは何ですか? –