【问题标题】:Why doesn't nHibernate support LIMIT when doing "join fetch"?为什么 nHibernate 在执行“join fetch”时不支持 LIMIT?
【发布时间】:2011-02-02 00:22:07
【问题描述】:

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

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

进一步讨论该主题以及“join fetch”的其他问题(例如获得笛卡尔积):正如 herehere 所指出的,可以使用 HQL 急切地加载子集合和 IC 标准。但是,ICriteria 不允许内部连接(导致笛卡尔积)和 HQL doesn't allow paging 数据库端的结果。

如果一个必须做同样的事情但被分页怎么办?

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

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

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2010-12-08
      相关资源
      最近更新 更多