2013-12-10 2 views
3

Я видел несколько примеров этого, и, насколько я могу судить, мой файл HBM следует тому же шаблону, но он не работает. Во-первых, файл:Как сопоставить сущность NHibernate с запросом

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping default-cascade="save-update" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="ThinAir" mutable="false" lazy="true" > 
    <id name="JobId"> 
     <generator class="native" /> 
    </id> 
    <property name="UserLogin"/> 
    <property name="UserEmail"/> 
    <property name="DateProcessed"/> 
    <loader query-ref="myquery"/> 
    </class> 
    <sql-query name="myquery"> 
    <return class="ThinAir"> 
     <return-property name="JobID" column="JobId"/> 
     <return-property name="userLogin" column="UserLogin"/> 
     <return-property name="DateProcessed" column="DateProcessed"/> 
     <return-property name="userEmail" column="UserEmail"/> 
    </return> 
    <![CDATA[ 
    SELECT DISTINCT JobID, 
    userLogin, 
    DateProcessed, 
    useremail 
    FROM   dbo.someothertable 
    ]]> 
    </sql-query> 
</hibernate-mapping> 

«myquery» in-and-of-itself, работает. То есть, если я позвоню

var x = session.GetNamedQuery("myquery").List(); 

Я получаю правильный список ThinAir объектов.

Но, когда я пытаюсь получить список ThinAirs так:

var submissions = session.CreateCriteria<ThinAir>().List<ThinAir>(); 

Я получаю

Метод испытания testThinAir бросил исключение: NHibernate.Exceptions.GenericADOException: не мог выполнить запрос [SELECT this_.JobId как JobId16_0_, this_.UserLogin как UserLogin16_0_, this_.UserEmail как UserEmail16_0_, this_.DateProcessed как DateProc4_16_0_ FROM ThinAir this_]

Моя интерпретация этого явления заключается в том, что NH игнорирует мой <loader> тег и поэтому пытается загрузить данные из базовой таблицы, по умолчанию он принимает на себя, чтобы быть названным ThinAir, потому что это имя класс сущности, только там не любой ThinAir таблица, следовательно сообщение об ошибке.

Правильно ли это толкование? И в любом случае, что я делаю неправильно и как я могу сделать это правильно?

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

Майкл

ответ

3

Один из способов, как добиться этого, было бы переместить отображение из запроса в subselect:

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping default-cascade="save-update" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="ThinAir" mutable="false" lazy="true" > 

    <subselect> 
    <![CDATA[ 
    SELECT DISTINCT JobID, 
    userLogin, 
    DateProcessed, 
    useremail 
    FROM   dbo.someothertable 
    ]]> 
    </subselect> 

    ... // rest of the mapping 
+1

Большое спасибо: Это работает как шарм, хотя я все еще не понимаю, почему мой оригинальный метод не сделал ... Где черт этот материал задокументирован? – Michael

+0

Отлично, если это помогло. Да, документация может быть немного лучше. Но это так или иначе, NHiberante делает удивительные вещи ... которые могут быть частично трудно найти;) удачи –