0

NHibernate で名前付きクエリを実行すると、いくつかの問題が発生します。戻り値として設定しているクラスは、抽象ではなくOrganizationであり、 FullOrganizationという 2 番目のクラス (このクラスから継承) があります。具体的なクラススキーマごとにテーブルがあり、他のすべては正常に機能していますが、名前付きクエリを実行すると例外が発生し続けます(ところで、詳細は提供されません)。

マッピングは次のようになります。

<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 のインスタンスである可能性があることを考慮してください。

4

1 に答える 1

1

質問を正しく理解している場合、検索には 2 つの方法がありますか? すなわち

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 >();

メソッドが 1 つある場合は、スイッチを設定して目的のメソッドを適用できます。SetResultTransformer

于 2011-04-21T15:15:43.597 に答える