2010-03-29 67 views
1

在nHibernate中,如果您通过“join fetch”执行HQL查询以加载子集合,nHibernate将忽略SetMaxResults和SetFirstResult,并尝试从数据库中检索每个项目的。为什么?这种行为是特定于HQL的,因为ICriteria支持急切的加载(尽管有外连接)和LIMIT。为什么nHibernate在进行“连接读取”时不支持LIMIT?

这里有更多的细节http://www.lesnikowski.com/blog/index.php/nhibernate-ignores-setmaxresults-in-sql/

进一步的主题,关于与“连接抓取”(如获取笛卡尔乘积的结果)等问题

:如指出herehere,可以热切负载子集合既HQL和的ICriteria。然而,ICriteria不允许内部连接(产生笛卡尔积),而DB边的结果是HQL doesn't allow paging

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

SetMaxResults,但这可能会导致加载问题。 在这一点上,我可能想要执行两个完全独立的查询,首先得到实体,然后加载相关的关联。

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

回答

2

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

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

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