为什么nHibernate在执行“join fetch”时不支持LIMIT?

时间:2010-03-29 11:51:14

标签: nhibernate

在nHibernate中,如果您使用“join fetch”执行HQL查询以急切加载子集合,nHibernate将忽略SetMaxResults和SetFirstResult并尝试从数据库中检索每个项目。为什么?此行为特定于HQL,因为ICriteria支持急切加载(尽管使用外部联接)和LIMIT。

此处有更多详情http://www.lesnikowski.com/blog/index.php/nhibernate-ignores-setmaxresults-in-sql/

关于这个主题以及关于“加入获取”的其他问题(例如结果获得笛卡尔积):正如herehere指出的那样,可能会急切地加载孩子包含HQL和ICriteria的集合。但是,ICriteria不允许内部联接(产生笛卡尔积),并且在数据库端允许HQL doesn't allow paging

  

如果必须做同样的事情但是要分页怎么办?

     

SetMaxResults,但这可能会导致加载问题。   那时,我可能想要执行两个完全独立的查询,首先只获取实体,然后加载相关的关联。

那么分页在这里有什么问题以及可能的解决方案是什么?

1 个答案:

答案 0 :(得分:2)

看起来nHibernate试图通过总是在急切加载的集合上进行外连接来填充整个子集合,从而导致一组具有相同左侧部分的非同一行。

 Id | CollectionId
-------------------
  1 | 1
  1 | 2
  2 | 3
  3 | 4
  3 | 5

你明白了。这样的行集上的LIMIT没有任何意义,因为你实际上会限制nHibernate的内部数据,而不是限制你真正感兴趣的结果集。但是,我还没有找到一种方法来急切加载分页。我认为只用一个查询就不可能做到。