ISQLQuery от NHibernate возвращает экземпляры неожиданного типа - PullRequest
2 голосов
/ 08 апреля 2010

Я использую 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. Однако он содержит несколько копий одного экземпляра.

Ответы [ 3 ]

2 голосов
/ 08 апреля 2010

Я не уверен, что это реальная причина вашей проблемы, но вы должны заключить псевдонимы SQL в фигурные скобки, например,

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 ...
0 голосов
/ 09 апреля 2010

Я решил проблему немного по-другому. Я не знал, что вы можете использовать выражение SQL в качестве критерия ICriteria (спасибо Google-группе NH-Users), поэтому я сделал это так:

ICriteria crit = session.CreateCriteria (typeof(Prestation), "p");

crit.SetFetchMode ("p.Prices", FetchMode.Eager);

crit.Add (Expression.Sql ("{alias}.PrestationId = ( SELECT id FROM sometable WHERE ... "));

crit.SetResultTransformer (Transformers.DistinctRootEntity);

var result = crit.List<Prestation>();

В любом случае, остается вопрос, ожидается ли поведение, которое я использую с помощью ISQLQuery, или ошибка ...

Поток NHUsers, который я также начал

0 голосов
/ 08 апреля 2010

Попробуйте указать тип, который будет возвращен в методе List:

var result = query.List<Prestation>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...