【问题标题】:nHibernate Criteria queries produces duplicates using PagingnHibernate Criteria 查询使用分页产生重复
【发布时间】:2011-10-27 23:40:05
【问题描述】:

版本 nHibernate 2.1

从大量类似问题中可以看出 - 我们并不是唯一遇到分页生成重复问题的人。我们认为这只是发生在 HQL 查询中,但我们的一位客户报告说在查询是 Criteria 查询的地方看到了这种情况。

到目前为止,我们只在报告方面看到它 - 我们倾向于从各种“关联”实体收集信息位并使用 AliasToBeanTransformer 将其放入 DTO (DataTransferObject):

.SetResultTransformer(new AliasToBeanResultTransformer(typeof(OurDTO)));

我们对 nHibernate 并不陌生,但我们当然不知道它的许多微妙之处,因此不知道

新的 NHibernate.Transform.DistinctRootEntityResultTransformer()

这可能会消除我们的重复项,但我正在努力了解当它不是映射实体(即 DTO)时我们如何做到这一点。

我们已尝试创建一种自定义方言,该方言似乎已经为某些人提供了良好的服务,足以让他们对一致的行为充满信心。

我意识到没有灵丹妙药,上下文总是最重要的,但是有没有人设法为此想出解决方案?

我们用来处理页面排序的代码如下:

        query.SetMaxResults(50);

        for (int i = 0; ; ++i)
        {
            query.SetFirstResult(i * 50);
            IList results = query.List();
            cumulativeResults.AddRange(results);
            OnRecordsLoaded(results.Count);
            if (results.Count < 50)
            { break; }

非常感谢您对此的任何意见。 亲切的问候 科林

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    NHibernate 不会产生重复项。关系数据库可以。你无法阻止它。

    如果您的查询涉及一对多连接,假设您有客户和订单表,并且客户和订单之间存在一对多关系,并且您查询按订单过滤的客户,您将获得多个多个客户(同一身份)

    防止它在内存中使用 HashedSets 的方法是假设你为你的实体正确地覆盖了 Equals 和 GetHashCode,你应该这样做。如果将结果放入 HashedSet(来自 Iesi 或 .NET 4),它们将消除重复项。

    这是 ORM 的问题之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      相关资源
      最近更新 更多