Сопоставление NHibernate с пользовательским загрузчиком не работает

#sql #nhibernate-mapping #loader

#sql #nhibernate-сопоставление #загрузчик

Вопрос:

У меня есть класс, сопоставленный с NHibernate, и я пытаюсь использовать пользовательский sql-запрос для загрузки. Особенность в том, что он использует составной идентификатор, но я бы ожидал, что здесь это не проблема.

Вот упрощенная версия сопоставления:

 <class name="Person" mutable="false">
  <composite-id>
    <key-property name="PropertyA" column="propA" type="int" />
    <key-property name="PropertyB" column="propB" type="string" />
  </composite-id>
  <property name="PropertyC" column="propC" type="datetime" />
  <loader query-ref="loadPersons" />
</class>
<sql-query name="loadPersons">
   <return class="PV" />
   <![CDATA[
   SELECT propA, propB, propC FROM MyPersons
   ]]>
</sql-query>
  

Проблема в том, что загрузчик полностью игнорируется. Запрос, отправленный в базу данных, полностью генерируется, как если бы <loader> элемента там не было:

 SELECT this_.propA, this_.propB, this_.propC FROM Person this_
  

Это, очевидно, приводит к ошибке: таблица или представление не существует (потому что ‘Person’ — это просто наше чистое имя).

Кто-нибудь знает, связано ли это с составным идентификатором или есть другая причина, по которой загрузчик будет проигнорирован?

Пожалуйста, обратите внимание, что также может возникнуть ошибка при возврате данных. Я видел, что для этого есть специальный синтаксис псевдонимов, но я не могу понять это до того, как загрузчик действительно что-то сделает…

Ответ №1:

Я знаю, что это очень старый вопрос, но я искал ответ и кое-что придумал. В качестве таблицы используется запрос, заключенный в круглые скобки. Это немного некрасиво, но у меня работает:

 <class name="Person" mutable="false" table="(SELECT propA, propB, propC FROM MyPersons)">
  <composite-id>
    <key-property name="PropertyA" column="propA" type="int" />
    <key-property name="PropertyB" column="propB" type="string" />
  </composite-id>
  <property name="PropertyC" column="propC" type="datetime" />
</class>