Я использую NHibernate 2.1.2.400, и у меня возникла проблема с запросом ISQLQuery.
Причина, по которой я здесь использую ISQLQuery, заключается в том, что в этом запросе используется таблица, для которой у меня нет сущности, сопоставленной в NHibernate.
Запрос выглядит так:
ISQLQuery query = session.CreateSQLQuery (
"select p.*, price.* " +
"from prestation p left outer join prestationprice price on p.PrestationId = price.PrestationId " +
"where p.Id IN ( select id from prestationregistry where ...");
'Prestationregistry' - это таблица, которая не известна NHibernate (не отображена, следовательно, собственный SQL-запрос).
мой код продолжает так:
query.AddEntity ("p", typeof(Prestation));
query.AddJoin ("price", typeof(PrestationPrice));
query.SetResultTransformer (Transformers.DistinctRootEntity);
var result = query.List();
Пока все хорошо.
Я ожидаю, что в результате этого запроса мне дали список экземпляров Prestation, поскольку я объявил Prestation как корневой объект, который должен быть возвращен методом AddEntity.
Я также ожидаю, что PrestationPrices для каждого Prestation будут загружены этим запросом (отсюда и метод AddJoin).
К моему удивлению, метод List () возвращает коллекцию экземпляров PrestationPrice вместо экземпляров Prestation.
Как так ? Я делаю что-то неправильно ? И если да, не могли бы вы сказать мне, что я делаю неправильно?
Редактировать: Дополнительная информация:
Когда я отлаживаю и ставлю наблюдение за экземпляром 'query', я вижу, что queryReturns
член запроса содержит 2 элемента:
- один экземпляр NativeSqlQueryRootReturn, для которого ReturnEntityName является «Prestation»
- один NativeSqlQueryJoinReturn
Когда я не указываю преобразователь результата «DistinctRootEntity», запрос возвращает экземпляры «Prestation» вместо PrestationPrice. Однако он содержит несколько копий одного экземпляра.