【问题标题】:nhibernate, eager loading and pagingnhibernate,急切加载和分页
【发布时间】:2011-05-23 12:29:46
【问题描述】:

我正在创建一个使用休眠和分页的 mvc 应用程序。我有一个父母>孩子的关系,我正试图急切地加载我的孩子记录。这一切都很好。

我遇到的问题是分页。我希望每页有 15 个项目。如果每个父母只有一个孩子,这将非常有效。问题是当父母有超过 1 个孩子时。例如,如果父项有 2 条子记录,则数据库实际上选择 15 条记录,其中两条代表同一个父项,两个子项各有一条。因此,在我的页面数据视图中,似乎只有 14 条记录。

有谁知道我如何在仍然渴望加载我的子实体的同时仅按父项获取我的页数?
这将是一个面向公众的网站,所以我认为延迟加载不是一个好主意,因为它会导致服务器访问次数过多。

NHibernate 中是否有内置的东西可以处理我缺少的这个问题?

感谢您的任何想法。

【问题讨论】:

    标签: nhibernate pagination eager-loading


    【解决方案1】:

    您需要在查询中使用不同的根实体结果转换器。您尚未说明您使用的是 HQL 还是 Criteria,但两者的 API 相似。

    // criteria
    criteria.SetResultTransformer(Transformers.DistinctRootEntity)
    

    这将强制结果集仅包含不同的父实体。

    【讨论】:

    • 我正在使用不同的根实体,但它每次仍然计算多个子项,而不仅仅是计算不同的父项。
    • @James Gregory - 您的建议不起作用,因为分页通常表示为 SELECT TOP(@p0) .... 并且在急切加载的情况下,您有连接,这将使某些实体出现远低于 TOP 规定的限制。
    【解决方案2】:

    您可以使用 fetch="subselect" 标记您的关联属性 - 这也可以确保您不会因为每个选择进行两次查询而遇到巨大的笛卡尔积问题。

    【讨论】:

      【解决方案3】:

      在子集合的映射中使用batch-size 提示可能是处理此问题的最佳/最简单的方法。如需进一步讨论,请参阅我对此similar question 的回答。

      【讨论】:

      • 换句话说,这个答案建议切换到延迟加载,并在延迟加载时启用批处理,以避免 N+1 性能问题。
      猜你喜欢
      • 2011-04-02
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多