NHibernate在使用Fetch时返回子集合中的重复对象

NHibernate在使用Fetch时返回子集合中的重复对象,nhibernate,Nhibernate,当执行这样的查询时(使用Nhibernate 2.1.2): 您可以通过指定SetResultsTransformer(Transformers.distinctroventy)来选择单个不同的结果您正在这里执行一项任务。不要。相反 顺便说一句:这不是特定于NHibernate的,这同样适用于任何平台中的任何ORM,甚至是没有任何ORM的纯SQL。通常,当您可以取回N+M行时,您不希望取回N*M行。我没有使用NHibernate(更确切地说,是常规的“ol Hibernate”),但在Hiber

当执行这样的查询时(使用Nhibernate 2.1.2):


您可以通过指定
SetResultsTransformer(Transformers.distinctroventy)来选择单个不同的结果

您正在这里执行一项任务。不要。相反


顺便说一句:这不是特定于NHibernate的,这同样适用于任何平台中的任何ORM,甚至是没有任何ORM的纯SQL。通常,当您可以取回N+M行时,您不希望取回N*M行。

我没有使用NHibernate(更确切地说,是常规的“ol Hibernate”),但在Hibernate的Java版本中,您可以将一对多集合定义为列表或集合。如果将它们定义为集合,则不会得到重复项。令人惊讶的是,这种情况在不重写equals()的情况下发生。不幸的是,我也有同样的问题,我想要列表,这样我就可以与Wicket集成,但不需要重复…

您将您的收藏映射为什么?例如,如果你使用包,你会得到重复的。您可以改为使用集合,这样就不会得到重复的集合。

尝试使用:

ICriteria标准未来1
=session.CreateCriteria()
.SetFetchMode(“ChildCollection1”,FetchMode.Eager)
.Add(限制.IdEq(id))
.SetResult变压器(变压器距离)
.未来价值();
ICriteria标准未来2
=session.CreateCriteria()
.SetFetchMode(“ChildCollection2”,FetchMode.Eager)
.Add(限制.IdEq(id))
.SetResult变压器(变压器距离)
.未来价值();
返回标准Future1.值;

谢谢。我来看看。你知道为什么这不是默认行为吗?谁会想要复制品?!这和我面对你的问题时问的问题是一样的。这不是一个真正的答案,但让我们想想在查询端会发生什么:结果记录集将包含重复项,NH模拟了这种背景行为。在任何情况下,NH在内部使用相同的实体,它们只是返回列表中的重复条目。@Felice Pollano,刚刚添加了resultstransformer。不幸的是,这对我来说没有任何改变——我仍然在得到副本。也许这取决于集合的类型?DistincTrotenty仅适用于根实体,这不是这里的问题。@FrancoisBotha:它也适用于我,只要我只有一个联接,当我有3个联接时,它就停止工作。如果你获取的是1000个条目而不是唯一的结果呢?当然,一个SQL查询中的两个联接(笛卡尔积)比2001选择更有效,即使它返回更多行(这部分取决于集合的大小)。我可能已经跳过了枪——在大多数情况下你是对的。发出两个查询可能是有意义的,一个是一个连接。我使用了Future methode来解决这个问题,NH为我做了其余的。仍然没有办法做到这一点?检查这是否有效(我只在NH 3上使用QueryOver对其进行了测试,但看起来是一样的):
 ICriteria criteria = session.CreateCriteria<MyRootType>()
                .SetFetchMode("ChildCollection1", FetchMode.Eager)
                .SetFetchMode("ChildCollection2", FetchMode.Eager)
                .Add(Restrictions.IdEq(id));
ICriteria criteria = session.CreateCriteria<MyRootType>()
                .SetFetchMode("ChildCollection1", FetchMode.Eager)
                .SetFetchMode("ChildCollection2", FetchMode.Eager)
                .Add(Restrictions.IdEq(id));

 criteria.SetResultTransformer(Transformers.DistinctRootEntity);

 return criteria.UniqueResult<MyRootType>();
ICriteria criteriaFuture1
    = session.CreateCriteria<MyRootType>()
        .SetFetchMode("ChildCollection1", FetchMode.Eager)
        .Add(Restrictions.IdEq(id))
        .SetResultTransformer(Transformers.DistinctRootEntity)
        .FutureValue<MyRootType>();
 ICriteria criteriaFuture2
    = session.CreateCriteria<MyRootType>()
        .SetFetchMode("ChildCollection2", FetchMode.Eager)
        .Add(Restrictions.IdEq(id))
        .SetResultTransformer(Transformers.DistinctRootEntity)
        .FutureValue<MyRootType>();

 return criteriaFuture1.Value;