我试图限制 NHibernate Criteria 将返回的实体数量。标准似乎是使用 SetMaxResults,但如果我的条件涉及多对多关系上的 LEFT OUTER JOIN,则此方法无法正常工作。
一个例子:
狗有主人(多对多关系),我需要检索属于某些主人的最多 10 条狗。正在做
session.CreateCriteria<Dog>()
.CreateAlias("Owners", "Owners")
.Add(Restrictions.In("Owners.Id", idCollection)
.SetMaxResults(10)
.List<Dog>();
将转换为 SQL 查询,例如
SELECT TOP(10) * FROM DOGS d
LEFT OUTER JOIN OWNERS_DOGS od ON d.id = od.id
WHERE od.OWNER_ID IN (:valueone, :valuetwo)
我的 TOP 限制发生得太早,导致一只拥有多个符合条件的主人的狗多次计数到我的限制 10。有没有一种干净的方法告诉 NHibernate 我只想给第一只 X 狗补充水分物体?我可能无法摆脱对数据库执行完整的 SELECT,但如果我可以避免加载系统中的每条狗,那就太好了,因为我只会显示其中的 10 条。
最佳答案
本例中的解决方案是子查询。我们需要的是创建内部SELECT,它将由狗主人过滤并返回狗ID。然后我们将查询 Dogs,通过该子查询过滤它们。最后,在平面结构上执行时,我们的分页将是正确的。
请参阅此答案以了解更多详细信息:https://stackoverflow.com/a/14080092/1679310
子查询15.8. Detached queries and subqueries :
DetachedCriteria subQuery = DetachedCriteria.For(typeof(Dog))
// WHERE conditions go here
.SetProjection( Projections.Property("ID") )
;
正确分页的查询
session.CreateCriteria(typeof(Dog))
.Add(Subqueries.PropertyEq("ID", subQuery));
// PAGING goes here
.SetMaxResults(10)
.List();
关于nhibernate - 限制返回的 NHibernate 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14715321/