命名查询和继承
本文关键字:继承 查询 | 更新日期: 2023-09-27 17:51:25
我在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的实例。
如果我正确理解问题,您是否有两种搜索方法?例如
SearchOrganisations
和SearchFullOrganisations
如果答案是肯定的,那么我将删除
<return class="Organization" />
,在代码中您可以使用AliasToBeanResultTransformer
so one method
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