Именованный запрос и наследование - PullRequest
0 голосов
/ 21 апреля 2011

У меня возникают некоторые проблемы при запуске именованного запроса в NHibernate.Класс, который я устанавливаю в качестве возвращаемого значения: Organization - не абстрактный - и у меня есть второй класс (который наследуется от этого) с именем FullOrganization .У меня есть таблица для каждой конкретной схемы классов, и все остальное работает нормально, но я продолжаю получать исключение при выполнении именованного запроса (который BTW не предоставляет никаких подробностей).

Отображение близко кследующее:

<hibernate-mapping 
xmlns="urn:nhibernate-mapping-2.2" 
namespace="XXX" 
assembly="XXX" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:nhibernate-mapping-2.2 ..\nhibernate-mapping.xsd" auto-import="false">
<class name="Organization" table="Organizations" lazy="false">
    <id name="Identity" column="Id">
        <generator class="identity"/>
    </id>

    <property name="Name" column="Name" />
    <many-to-one name="OrganizationType" column="OrganizationTypeId"/>
...
            <joined-subclass name="FullOrganization" table="FullOrganizations" lazy="false">
        <key column="OrganizationId"/>
                    ...
            </joined-subclass>
</class>

И именованный запрос выглядит примерно так:

<sql-query name="OrganizationSearch" read-only="true" cacheable="false">
<return class="Organization" />
<![CDATA[
  SELECT *
  FROM Organizations o
  INNER JOIN OrganizationTypes ot ON o.OrganizationTypeId = ot.Id 
  LEFT JOIN FullOrganizations fo ON o.Id = fo.OrganizationId
  WHERE 
    // Several Filters Here
]]>

Как мне отобразить результаты запроса?Пожалуйста, примите во внимание, что возвращаемые объекты могут быть экземплярами Organization или FullOrganization.

1 Ответ

1 голос
/ 21 апреля 2011

Если я правильно понял вопрос, у вас есть два способа поиска? т.е.

SearchOrganisations и SearchFullOrganisations

Если ответ да, я бы удалил

<return class="Organization" />

и в коде вы можете использовать AliasToBeanResultTransformer

так один метод

return Session
    .GetNamedQuery("OrganizationSearch")
    .SetString("Param1", param1)
    .SetResultTransformer(new AliasToBeanResultTransformer(typeof(Organization )))
    .List<Organization >();

, а также

return Session
    .GetNamedQuery("OrganizationSearch")
    .SetString("Param1", param1)
    .SetResultTransformer(new AliasToBeanResultTransformer(typeof(FullOrganization )))
    .List<FullOrganization >();

Если у вас есть один метод, вы можете установить переключатель для применения желаемого SetResultTransformer

...