2016-08-17 4 views
0

を満たしている場合、私は2つのテーブルを持っている親とすべての子をフェッチ子供は10歳以上で、親は結婚しています。 つまり、 P1に2人の子供、c1 age = 11、c2 = 8があり、p1.marritalStatusが結婚しているとします。
したがって、私のクエリはP1をc1とc2でフェッチする必要があります。Hibernateは子供たちのいずれかが基準

今はP1をc1でフェッチするだけです。 No c2。そして、p1.getChildren()はc1だけを返します。

私のHQLは、次のようになります。私は実行

第一クエリ:p個のLEFTはどこc.age cとp.childrenをフェッチ登録しようとして

parentIDList =親IDのリストを取得するには、親からp.parentIDを選択> 10とp.marritalStatus =「

を「結婚し」私は(NOは子テーブルに参加し

第二のクエリで親表の第二のクエリを正しい親IDリスト パスの親ID(P1この場合)のリストを取得します) "親からPへp.parentID IN(parentIDList)"

FetchTypeはEAGERなので、私は親をフェッチするときにhibernateがすべての子をフェッチすると思っています。

2番目のクエリで子テーブルと結合しようとしましたが、望ましい結果が得られませんでした。

私の第1のクエリは正常に動作し、正しい親リストを取得します。第2のクエリを実行すると、私の問題はすべて子どもになっていません。それを解決する方法?

答えて

0

を試してみてください。私はfetchtypeがEAGERであるので、すべての子供を引き出すために2回目に参加する必要はありません。

0

結婚している両親を取得するために、これを試してみてください:

select c.parent.parentID from Children c where c.age > 10 and c.parent.marritalStatus = 'married' 

説明:

子供たちは親を知っているので、あなたは親のフィールドへのアクセスを持っています。

+0

私はできません - 子供から手をつないでください。私は親だけを得ることができ、親からの子供だけです。 – DaenKhaleesi

+0

なぜですか?あなたは子供に対してフィールド/関係として定義されています。 – javydreamercsw

0

まず、HibernateでHQLクエリを起動すると、エンティティレベルフェッチモード(fetch = FetchType.EAGER)は常に無視されます。すべての子供を親と一緒にするには、明示的に参加する必要があります。ですから、joinを使って子テーブルレコードを取得する通常のhqlクエリを書き留めてください。

+0

2回目の左の結合フェッチは、最初と同じ結果を返します。 C1のみのP1いいえ、C2。 – DaenKhaleesi

0

は、私がセッションをクリアしなければならなかった....それは私のために働く特定のクエリの下

select p From Parent as p JOIN FETCH p.children as c where c.age >= 10 
+0

はい、同じクエリを使用しましたが、C1> 10のParentをフェッチします。 P1には2人の子供C1.age = 11とC2.age = 8があります。私はP1を望み、それはすべて子供C1とC2です。 – DaenKhaleesi

+0

2回目の結合のようにも同じ結果を返します。それはわずか1人の子供を持つ親です。リフレッシュが必要ですか?繰り返しデータを使用している場合は – DaenKhaleesi

+0

... query.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); – Gokul

関連する問題