1

假设两个类有一个 ParentClass 和一个 ChildClass。父母有一个袋子来生孩子。
我已经尝试过 .SetResultTransformer(new DistinctRootEntityResultTransformer()) 和 distinct() 过滤掉重复并且在获取 .SetMaxResults() 时我没有在 ParentClass 级别得到它。

有什么东西可以用来让 .SetMaxResults() 在 ParentClass 级别而不是 ChildClass 上工作。我需要在父级别强制执行 maxresults。

示例 ParentClass 有 6 个孩子,setmaxresults(6) 和 distinct() 将导致我在查询中查找更多 5 ParentClass 记录时得到一个 ParentClass。我的标准包括 3 个与父记录匹配的参数和 2 个与子记录匹配的参数

4

1 回答 1

0

一种解决方案可能是使用子查询。文档14.11。子查询

它将像内部选择一样工作。子查询将包含 WHERE 子句,其中包含要匹配的 2 个参数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 回答