1

ParentClass と ChildClass の 2 つのクラスがあるとします。親は子供を持つバッグを持っています。
繰り返しを除外する .SetResultTransformer(new DistinctRootEntityResultTransformer()) と distinct() を試しましたが、 .SetMaxResults() をフェッチするときに ParentClass レベルで取得していません。

.SetMaxResults() を ChildClass ではなく ParentClass レベルで動作させるために使用できるものはありますか。親レベルで maxresults を強制する必要があります。

6 つの子を持つ ParentClass の例と setmaxresults(6) および distinct() は、クエリでさらに 5 つの ParentClass レコードを探しているときに、単一の ParentClass になります。私の基準には、親レコードと一致する3つのパラメーターと子レコードと一致する2つのパラメーターが含まれています

4

1 に答える 1

0

1 つの解決策は、サブクエリを使用することです。ドキュメント14.11. サブクエリ

内部選択のように機能します。サブクエリには、一致する 2 つのパラメーターを持つ WHERE 句とChild、返すプロジェクションが含まれますParent.ID。マスター クエリには、フィルタリングする 3 つのパラメーターParentと、Parent ID.

サブクエリ:

var sub = DetachedCriteria
 .For<Child>()
 .Add(Restrictions.In("FirsChildProperty", new int[] {1, 2 })) // WHERE
 .Add(Restrictions.... // Second
 .SetProjection(Projections.Property("Parent.ID")); // Parent ID as a SELECT clause

マスター クエリ:

var criteria = session.CreateCriteria<Parent>()
 .Add(Restrictions.In("FirsParentProperty", new int[] {1, 2 })) // WHERE
 .Add(Restrictions.... // the second
 .Add(Restrictions.... // the third
 // no filter to match children
 .Add(Subqueries.PropertyIn("ID", sub)); // Parent.ID in (select
 // now paging just over Parent table....
 .SetFirstResult(100) // skip some rows
 .SetMaxResults(20)   // take 20

var result = criteria.List<Parent>();
于 2013-02-21T09:18:54.637 に答える