2011-04-20 84 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