首先,是的,我使用DistinctRootEntityResultTransformer。
我有以下的(功能NHibernate)映射:
public FirstObjectMap()
{
Id(x => x.Id):
HasMany<SecondObject>(x => x.SecondItems).KeyColumn("FirstObject_ID");
}
public SecondObjectMap()
{
Id(x => x.Id).Column("ID");
References(x => x.ThirdObject).Column("ThirdObject_ID");
}
public ThirdObjectMap()
{
Id(x => x.Id).Column("ID");
HasMany<D>(x => x.FourthItems).KeyColumn("ThirdObject_ID");
}
public FourthObjectMap()
{
Id(x => x.Id).Column("ID");
}
请注意,这SecondObject指ThirdObject(意味着关键是SecondObject)。
我的查询如下所示:
var query = session.CreateQuery("select distinct first from " +
"FirstObject as first " +
"left join fetch first.SecondItems as second " +
"left join fetch second.ThirdObject as third " +
"left join fetch third.FourthItems as four where ...");
// This is not even needed as I'm using distinct in HQL
query.SetResultTransformer(new DistinctRootEntityResultTransformer());
var results = query.List<ReinsurableObject>();
为了测试,我有1 FirstObject,1 SecondObject,1 ThirdObject和数据库24个FourthObjects。 作为espected的SQL查询返回24行。
然而,这里的渔获:NHibernate的创建:
1 FirstObject
24 SecondObject (should be 1)
24 x 1 ThirdObject (should be 1)
24 x 1 x 24 FourthObject (should be 24)
所以NH不管是什么原因造成的24 SecondObject而不是1。
我猜它不知道如何映射“连接抓取”(左或内似乎并不重要),参考(在SecondObject引用ThirdObject)。
我有哪些选择? 我不能改变的数据模型,但我确实需要急于负荷这一切。
提前致谢!