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

UpT*_*eek 16 nhibernate

在进行这样的查询时(使用Nhibernate 2.1.2):

 ICriteria criteria = session.CreateCriteria<MyRootType>()
                .SetFetchMode("ChildCollection1", FetchMode.Eager)
                .SetFetchMode("ChildCollection2", FetchMode.Eager)
                .Add(Restrictions.IdEq(id));
Run Code Online (Sandbox Code Playgroud)

我以一些笛卡尔式的方式获得了多个重复的对象.例如,如果ChildCollection1有3个元素,并且ChildColection2有2个元素,那么我得到结果,每个元素在ChildColection1一个重复,并且每个元素都是ChildColection2三重的!这对我而言是一个WTF时刻......

那么如何正确地做到这一点?

  • 是否仅在指定一个集合时才支持使用SetFetchMode?
  • 我只是错误地使用它(我已经看到了对结果变换器的一些引用,但想象这会更简单).
  • 这是NH3的不同之处吗?

更新:

根据Felice的建议,我尝试使用DistinctRootEntity转换器,但这仍然是返回重复项.码:

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>();
Run Code Online (Sandbox Code Playgroud)

Fel*_*ano 15

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

  • 谢谢。我会看一下。您知道为什么这不是默认行为吗?谁想要重复的?! (2认同)
  • DistinctRootEntity仅适用于*root*实体,这不是问题所在. (2认同)
  • @FrancoisBotha:只要我只有一个连接,它也适用于我,当我有3个连接时它停止工作. (2认同)

Mau*_*fer 10

你在这里做笛卡尔产品.别.而是单独获取每个集合.

BTW:这不是特定于NHibernate的东西,同样适用于任何平台中的任何ORM,甚至是完全没有任何ORM的纯SQL.通常,当您可以获取N + M时,您不希望获取N*M行.

  • 如果您获取1000个条目而不是唯一结果,该怎么办?当然,单个SQL查询中的两个JOIN(笛卡尔积)比2001选择更有效,即使它返回更多行(这部分取决于集合的大小). (2认同)