nhibernate - 限制返回的 NHibernate 实体

标签 nhibernate many-to-many max

我试图限制 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/

相关文章:

java - @ManyToMany 和更新实体

mapping - Entity Framework 代码优先 - 多对多外键问题

nhibernate - 无法转换类型为 'NHibernate.Collection.Generic.PersistentGenericBag to type ' System.Collections.Generic.List 的对象

c# - 具有 2 列主键 (CompositeId) 的表的外键

grails - Grails中的多对多未将记录保存在关系表中

c++ - Max 和 Min 显示为 true 而不是数字,我该怎么办?

matlab - max 会引入舍入误差吗?

mysql - 如何获得下一个最高记录而不是最高记录?

nhibernate - 从父集合中删除子记录

nhibernate - 将 Nhibernate.Search 与 Nhibernate 2 集成