8

1つのSQLステートメントで実行したいHibernate基準呼び出しがあります。私がやろうとしているのは、外部結合を使用して子をロードしているときに、値の範囲(SQL IN句)のプロパティを持つ子を持つParentのインスタンスを選択することです。これが私がこれまでに持っているものです:

 Criteria c = session.createCriteria(Parent.class);

 c.createAlias("children", "c", CriteriaSpecification.LEFT_JOIN)
          .setFetchMode("c", FetchMode.JOIN)
          .add(Restrictions.in("c.property", properties));

 c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

 return c.list();

サンプルデータは次のとおりです。

Parent
Parent ID
A
B
C

Children
Child ID    Parent ID   property
...         A           0
...         A           2
...         A           7
...         B           1
...         C           1
...         C           2
...         C           3

私がやりたいのは、子の1つが私のバインドパラメータと等しいプロパティを持っている場合、親とそのすべての子を返すことです。プロパティが{2}を含む配列であると仮定しましょう。この場合、呼び出しは親AとCを返しますが、それらの子コレクションには要素2のみが含まれます。つまり、Parent [Children]:

A [2]&C [2]

私が欲しいのは:

A [0、2、7]&C [1、2 3]

これがバグでない場合は、セマンティクスが壊れているようです。A.getChildren()またはC.getChildren()を呼び出して、1つのレコードを返すことが正しいと見なされる方法がわかりません。これは、予測ではありません。つまり、デフォルトのselectフェッチを使用するようにクエリを拡張すると、適切な子コレクションが返され、多数のクエリが返されます。

  c.createAlias("children", "c").add(
      Restrictions.in("c.property", properties));

これはバグですか?そうでない場合、どうすれば希望の結果を達成できますか?

4

4 に答える 4

0

これは回避策で行うことができます。

Criteria c1 = session.createCriteria(Child.class);
c1.add(Restrictions.in("property", properties));
c1.setProjection( Projections.distinct( Projections.property( "parentId" ) ) );
List<Integer> parentIds = c1.list();

Criteria c2 = session.createCriteria(Parent.class);
c2.createAlias("children", "children");
c2.add(Restrictions.in("id", parentIds));
return c2.list();
于 2015-07-02T12:11:15.077 に答える
0

子クラスで基準を開始します。すべての子のリストを取得し、反復して各子の親を取得できます。

于 2013-04-02T10:47:20.750 に答える
0

getChildren() は getter/setter の名前にすぎません。クエリによって、オブジェクトがどのように読み込まれるかが決まります。

ここで最初の部分が吐き出されると推測します

SELECT * FROM Parent 
INNER JOIN Child c ON ... 
WHERE c.property in (x,y,z) 

それはあなたが望むものをあなたに与えません。これを生の SQL で書いていたら、次のようにします。

SELECT * FROM Parent  
WHERE ParentID IN (SELECT DISTINCT parentID FROM Child WHERE  c.property in (x,y,z))

最後の基準がこのクエリを生成していない場合は、基準を適切に再配置するとうまくいく可能性があります。(各休止状態が生成しているものも投稿できますか?)

于 2011-08-10T00:01:38.507 に答える