#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>