2011-04-20 113 views
0

我在NHibernate上运行命名查询时遇到了一些问题。我设置为返回值的类是组织 - 不抽象 - ,并且我有第二个类(继承自此)称为FullOrganization。我有一个每个具体类架构的表,其他一切工作都很好,但是在运行命名查询时(这个顺序不提供任何细节),我总是收到一个异常。命名查询和继承

的映射接近以下内容:

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

我应该如何映射查询结果?请注意,返回的对象可能是组织或FullOrganization的实例。

回答

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

+0

其实我期待我可以用一个单一的搜索方法,这就是为什么我做了LEFT在SQL查询中加入,WHERE部分的条件都是这种类型的OR(fo。 IS NOT NULL AND fo。 LIKE:pattern)。但现在你提到它,我可能错误的假设为NHibernate应创建组织或FullOrganization实例取决于只有当FullOrganization字段不是NULL ... – Anero 2011-04-21 15:37:07

+0

我没有遵循这个确切的实现,而是使用DTO结果集。但是,我正在将答案标记为接受,因为它会让我达成决议。谢谢! – Anero 2011-05-29 20:59:14