First of все, да, я использую DistinctRootEntityResultTransformer.
У меня есть следующее (Fluent 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 в базе данных. 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.
Я предполагаю, что он не знает, как отображать "join fetch" (левое или внутреннее не имеет значения )для ссылки (ссылка на третий объект в втором объекте ).
Какие у меня есть варианты? Я не могу изменить модель данных, но мне нужно загрузить все это.
Заранее спасибо!