2012-01-09 12 views
7

データベースからエンティティを選択するには、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つのクエリで複数レベルのエンティティを取得する方法を知っていますか?

答えて

10

JPQLでは動作しません。また、CriteriaQueriesでも動作させる方法はありません。 JPQLに参加についてフェッチ

An association or attribute referenced by the fetch method must be referenced from an entity or embeddable that is returned as the result of the query.

を::

The association referenced by the right side of the FETCH JOIN clause must be an association or ele ment collection that is referenced from an entity or embeddable that is returned as a result of the query.

同様の制限がある

についてCriteriaQueryと結合フェッチ:仕様限界が返さエンティティから直接参照されている中のものにエンティティをフェッチOpenJPAのドキュメントでも述べられています。

+0

お返事ありがとうございます。しかし、あなたが指摘したドキュメントの記事には、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を使ってやりたいことです。 –

+0

あなたはそれを非常に注意深く読まなかった。構文エラーの原因となるクエリの例です。そのクエリの前の文は次のとおりです: "次のクエリは構文エラーになります:"。あなたがしたいことは機能しません。 –

+3

ああ、そうです。ですから私は言うことができます:Ooops。しかし、とにかく...私はそのような問題を解決できる練習はありますか?この世界には2つ以上のテーブルを取りたい人がたくさんいると思う。最初に2番目のテーブルに参加する必要がありますか、または手動で他のデータを読み込む必要がありますか?そのベストプラクティスは何ですか? –

関連する問題