假设两个类有ParentClass和ChildClass。父母有一个孩子的包 我试过.SetResultTransformer(new DistinctRootEntityResultTransformer())和distinct()过滤掉重复和获取时.SetMaxResults()我没有在ParentClass级别获得它。
是否有任何可用于使.SetMaxResults()在ParentClass级别而不是在ChildClass上工作的东西。我需要在父级别强制执行maxresults。
示例具有6个子节点且setmaxresults(6)和distinct()的ParentClass将导致我只有一个ParentClass,而我在查询中寻找更多5个ParentClass记录。我的标准包括3个与父记录匹配的参数,2个与子记录匹配
答案 0 :(得分:0)
一种解决方案可能是使用子查询。文档14.11. Subqueries。
它将像内部选择一样工作。子查询将包含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>();