在nHibernate中,如果您使用“join fetch”执行HQL查询以急切加载子集合,nHibernate将忽略SetMaxResults和SetFirstResult并尝试从数据库中检索每个项目。为什么?此行为特定于HQL,因为ICriteria支持急切加载(尽管使用外部联接)和LIMIT。
此处有更多详情http://www.lesnikowski.com/blog/index.php/nhibernate-ignores-setmaxresults-in-sql/。
关于这个主题以及关于“加入获取”的其他问题(例如结果获得笛卡尔积):正如here和here指出的那样,可能会急切地加载孩子包含HQL和ICriteria的集合。但是,ICriteria不允许内部联接(产生笛卡尔积),并且在数据库端允许HQL doesn't allow paging。
如果必须做同样的事情但是要分页怎么办?
SetMaxResults,但这可能会导致加载问题。 那时,我可能想要执行两个完全独立的查询,首先只获取实体,然后加载相关的关联。
那么分页在这里有什么问题以及可能的解决方案是什么?
答案 0 :(得分:2)
看起来nHibernate试图通过总是在急切加载的集合上进行外连接来填充整个子集合,从而导致一组具有相同左侧部分的非同一行。
Id | CollectionId
-------------------
1 | 1
1 | 2
2 | 3
3 | 4
3 | 5
你明白了。这样的行集上的LIMIT没有任何意义,因为你实际上会限制nHibernate的内部数据,而不是限制你真正感兴趣的结果集。但是,我还没有找到一种方法来急切加载分页。我认为只用一个查询就不可能做到。