NHibernate Проекция с использованием SqlQuery - PullRequest
1 голос
/ 04 февраля 2010

Я пытаюсь воспроизвести стиль HQlQuery «Выбрать новый ObjectToProjectOut». то есть взять список столбцов, возвращаемых запросом, и вернуть их в виде списка типов ObjectToProjectOut, экземпляры которых создаются с помощью конструктора с таким количеством параметров, как столбцы в запросе.

Это, по сути, то, что 'select new ObjectToProjectOut' достигает в Hql .... но очевидно, что это не доступно в SqlQuery. Я думаю, что мне нужно установить преобразование результата и использовать PassThroughResultTransformer, DistinctRootEntityResultTransformer и т. Д., Чтобы заставить его работать.

Кто-нибудь знает, что я должен использовать?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2010

ок .... после просмотра кода NHibernate кажется, что я искал AliasToBeanConstructorResultTransformer .... конечно!

Однако, возможно, я обнаружил ошибку nHibernate.Если одно и то же имя столбца возвращено дважды из двух разных таблиц (скажем, market.name и account.name), то к тому времени, когда nHibernate вернет массив из БД в преобразователь, будет использовано первое вхождение «Name»и то и другое.Противный.

Обойти это однозначно псевдоним.В Hql сгенерированный sql сильно псевдоним, так что это только ошибка в SqlQuery.

Гррр.Сегодня должен быть мой день, также обнаружил другую ошибку / проблему nHibernate, которую я отправил в StackOverflow для комментариев.

1 голос
/ 04 февраля 2010

Вы можете использовать метод AddEntity для заполнения сущностей из SQL-запроса.

Вот два примера из документов NHibernate :

sess.CreateSQLQuery("SELECT * FROM CATS")
    .AddEntity(typeof(Cat));

sess.CreateSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS")
    .AddEntity(typeof(Cat));
...