命名查询和继承

时间:2011-04-20 22:12:03

标签: c# nhibernate inheritance named-query

在NHibernate上运行命名查询时遇到一些问题。我设置为返回值的类是组织 - 而不是抽象 - ,我有一个名为 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 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,你有两种搜索方法吗?即。

SearchOrganisationsSearchFullOrganisations

如果答案是肯定的,那么我会删除

<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