2011-02-03 18 views
1

Hy all、 私は子供、ペット、おもちゃの3つのテーブルを持っています。 Petには子IDの参照キーがあり、玩具には犬IDへの参照キーがあります。 私は子供と彼のペットに関するすべてのデータをロードしたいのですが、私はおもちゃのセットのため遅延読み込みが動作しません - jpa

@OneToMany(mappedBy = "petEntity", fetch = FetchType.LAZY) 
public Set<PetEntity> getPetEntitySet() { 
    return petEntitySet; 
} 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "ChildId", insertable = false, updatable = false) 
public ChildEntity getChildEntity() { 
    return childEntity; 
} 

同じおもちゃのデータをロードする必要はありません。私は

List<ChildEntity> list = entityManager.createQuery(
"SELECT c FROM ChildEntity c "+ 
"LEFT JOIN FETCH c.petEntitySet ", 
ChildEntity.class).getResultList(); 
    return list; 

を持っていますが、この事は私にすべてのデータだけでなく、子供の情報と彼のペットをロードし、データをロードする

。私はテーブル内のデータのみをロードするように、と作らないエンティティマネージャを抑制することができることは、私はあなたのアドバイス

ため

感謝することを望んでいないとき、私はそれを言及するのを忘れてしまった加入方法

このチェースはすべてのデータを読み込むだけでなく、子要素のコピーを1つ以上返します。

+0

DISTINCTを追加しますか? – axtavt

答えて

2

キーワードfetchを使用しているため、より多くのデータを読み込む理由があります。これはEAGERLY子供のペットがどんなものでもロードします。 fetchを削除すると、遅延ロードが発生します。

更新

私はちょうど私があなたがSetを使用していると仮定としてequals()hashCode()が正しく、すべての関連のクラスでオーバーライドされていることを確認し、これは実際にあなたが望むものであることがわかります。このように
は、JPAは重複

第二に更新クエリで

はい、簡単に使用することができますDISTINCTを探すために方法を知っています。あなたはそれがすべてのデータをロードすると思いますなぜ

ちょうどあなたの選択

List<ChildEntity> list = entityManager.createQuery(
"SELECT DISTINCT c FROM ChildEntity c "+ 
"LEFT JOIN FETCH c.petEntitySet ", 
ChildEntity.class).getResultList(); 
    return list; 
+0

子供がペットを1匹以上持っていて、結果リストに3匹がいるなら、3匹のペットがいて、樹皮の害虫ではない子供がいるでしょう(私はusisngセットです)それは、基準から明確なルートのようなものを使うことができる方法はありますか? –

+0

答えは –

+0

の私の更新を見てください。この問題の正確な解決策は何ですか?私は同様の問題を抱えています。クエリまたはエンティティのアノテーションから 'fetch'キーワードを削除しましたか? – Warz

関連する問題