版本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; }
非常感谢您对此提出的任何意见。 亲切的问候 科林
答案 0 :(得分:-1)
NHibernate不会产生重复。关系数据库的确如此。你不能阻止它。
如果您的查询涉及一对一加入,说您有客户和订单表,并且客户和订单之间存在一对多关系,并且您查询按订单过滤的客户,您将获得多个客户(相同的身份)
防止它在内存中使用HashedSets的方法,假设你为你的实体推进了过度Equal和GetHashCode。如果将结果放入HashedSet(来自Iesi或.NET 4),它们将消除重复项。
这是ORM的陷阱之一。