Nhibernate:二级收集中的独特结果

Nhibernate:二级收集中的独特结果,nhibernate,hql,Nhibernate,Hql,我有这样一个对象模型: class EntityA { ... IList<EntityB> BList; ... } class EntityB { ... IList<EntityC> CList; } select a left join a.b b left join b.c c 1: a1 | b1 | c1 2: a1 | b1 | c2 3

我有这样一个对象模型:

   class EntityA
   {
        ...
        IList<EntityB> BList;
        ...
   }

   class EntityB
   {
       ...
       IList<EntityC> CList;
   }
select a 
left join a.b b
left join b.c c
1: a1 | b1 | c1
2: a1 | b1 | c2
3: a1 | b2 | c3
4: a1 | b2 | c4
...
我在这个查询中遇到的第一个问题是从数据库返回重复项,我有EntityA重复项,因为使用BList进行左连接获取。 快速阅读hibernate文档,有一些解决方案,首先我尝试了distinct关键字,该关键字假定不会复制SQL distinct关键字,但在某些情况下除外,这可能是其中的一种情况,因为我有一个SQL错误,说我无法选择distict文本列(EntityA表中的列[Observations])。因此,我使用了另一种解决方案:

  query.SetResultTransformer(new DistinctRootEntityResultTransformer());
这很有效。但操作结果仍然没有通过测试。我进一步检查,发现EntityB现在有重复项,这是因为使用CList进行了左连接获取

问题是,如何在二级集合中使用distinct?我搜索并只找到根实体的直接子集合的解决方案,但从未找到第二级子集合的解决方案


谢谢你的时间

你不能简单地完成你想要的。我相信是C的左连接获取导致了重复。生成的查询如下所示:

   class EntityA
   {
        ...
        IList<EntityB> BList;
        ...
   }

   class EntityB
   {
       ...
       IList<EntityC> CList;
   }
select a 
left join a.b b
left join b.c c
1: a1 | b1 | c1
2: a1 | b1 | c2
3: a1 | b2 | c3
4: a1 | b2 | c4
...
db返回的行如下所示:

   class EntityA
   {
        ...
        IList<EntityB> BList;
        ...
   }

   class EntityB
   {
       ...
       IList<EntityC> CList;
   }
select a 
left join a.b b
left join b.c c
1: a1 | b1 | c1
2: a1 | b1 | c2
3: a1 | b2 | c3
4: a1 | b2 | c4
...
尽管您已经过滤了重复的根实体(A),但是由于C上的外部连接,DB需要为B表中的每个C条目返回重复条目。
解决此问题的一个简单方法是通过实用程序集合筛选项。根据您的实体需求,您也可以使用
哈希集
,以便它自动过滤掉它们。

使用
ISet
而不是
IList
(并将其映射为一组课程,而不是一个包)


集合不允许重复的实体

我遇到了同样的问题,无法通过hql解决重复问题。但是,我为所有集合创建了IEqualityComparer,并对每个集合执行了DISICT(),以消除hql结果上的重复项。

请参见我对这个问题的回答[question][1](这几乎是一个相同的副本:-)[1]:这只适用于第一个集合。第二个集合仍然包含重复的条目。我在这里遇到了同样的问题,但仍然没有找到解决方案。