Как преобразовать результат HQL в Список <T>, где T - сопоставленный класс - PullRequest
1 голос
/ 16 июля 2010

У меня есть этот запрос nhibernate:

var q =
               NHibernateSession.Current.CreateSQLQuery
               (
                    @"SELECT  LastestEvents.*
                    FROM    (
                            SELECT  DISTINCT SbQcontainer.Container
                            FROM    HistoricEvents
                            SbQcontainer WHERE SbQcontainer.LineCompany_Id = :lineCompany) as Sbq
                             JOIN HistoricEvents as  LastestEvents
                    ON      LastestEvents.id = (
                            SELECT TOP(1) id
                            FROM    HistoricEvents mi
                            WHERE   mi.Container = Sbq.Container and mi.LineCompany_Id = :lineCompany
                            ORDER BY mi.Date DESC
                            )"
               ).SetResultTransformer(Transformers.AliasToBean(typeof(HistoricEvent)));

            q.SetParameter("lineCompany",lineCompany.Id);
            q.SetCacheable(false);

            var results = q.List<HistoricEvent>().ToList();

Он ищет последние события в каждом контейнере для данной lineCompany, он работает, но я не знаю, как установить этот набор результатов в список T HistoricEvent, я пытаюсь эту строку:

.SetResultTransformer(Transformers.AliasToBean(typeof(HistoricEvent)));

Но выдает NHibernate.PropertyNotFoundException: Не удалось найти установщик для свойства 'Event_Id' в классе 'HistoricEvent'.

Есть ли способ сделать это? или, возможно, выполняете этот же запрос с использованием API-интерфейса ICriteria?

Заранее спасибо.

1 Ответ

4 голосов
/ 16 июля 2010

Если предположить, что HistoricEvent является сопоставленной сущностью, следующее должно дать вам то, что вы ищете:

var q = 
               NHibernateSession.Current.CreateSQLQuery 
               ( 
                    @"SELECT  LastestEvents.* 
                    FROM    ( 
                            SELECT  DISTINCT SbQcontainer.Container 
                            FROM    HistoricEvents 
                            SbQcontainer WHERE SbQcontainer.LineCompany_Id = :lineCompany) as Sbq 
                             JOIN HistoricEvents as  LastestEvents 
                    ON      LastestEvents.id = ( 
                            SELECT TOP(1) id 
                            FROM    HistoricEvents mi 
                            WHERE   mi.Container = Sbq.Container and mi.LineCompany_Id = :lineCompany 
                            ORDER BY mi.Date DESC 
                            )" 
               ).AddEntity(typeof(HistoricEvent)); 

            q.SetParameter("lineCompany",lineCompany.Id); 
            q.SetCacheable(false); 

            var results = q.List<HistoricEvent>().ToList(); 

Более подробную информацию см. В соответствующей документации .

...