nHibernate Criteria查询使用Paging生成重复项

时间:2011-10-27 23:40:06

标签: nhibernate

版本nHibernate 2.1

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

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

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

我们并不是nHibernate的新手,但我们当然不会意识到它的这么多细微之处,结果却没有意识到

new 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; }

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

1 个答案:

答案 0 :(得分:-1)

NHibernate不会产生重复。关系数据库的确如此。你不能阻止它。

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

防止它在内存中使用HashedSets的方法,假设你为你的实体推进了过度Equal和GetHashCode。如果将结果放入HashedSet(来自Iesi或.NET 4),它们将消除重复项。

这是ORM的陷阱之一。

相关问题