2

問題の説明:

入力パラメータを使用してストアド プロシージャを実行しようとしています。ストアド プロシージャは、MSSQL 2008 SQL Studio から実行すると正しく実行されます。ただし、NHibernate を使用して名前付きクエリとして実行するとエラーが発生します。

SessionFactory の設定時にエラーが発生します。 したがって、名前付きクエリを正しくマッピングしていないと思います。

ストアド プロシージャの詳細:

プロシージャの名前: CASCADE_POSITIONTEMPLATE_PERMISSIONS
入力パラメータ : PositionTemplateId

PositionTemplateUpdateCascadeResultストアド プロシージャは、指定したプロパティを持つクラスにカプセル化して返したいカウントを返します。

名前付きクエリ/クラス マッピング:

名前付きクエリ マッピング:

    <hibernate-mapping default-cascade="none" xmlns="urn:nhibernate-mapping-2.2" 
assembly="StudentVoiceGroups.Entities" namespace="StudentVoiceGroups.Entities" >
      <sql-query name="CASCADE_POSITIONTEMPLATE_PERMISSIONS" cacheable="false">
        <return class="PositionTemplateUpdateCascadeResult" alias="result">
          <return-property name="UpdatedPositionsCount">
            <return-column name="UpdatedPositionsCount" />
          </return-property>
        </return>
        exec CASCADE_POSITIONTEMPLATE_PERMISSIONS :PositionTemplateId
      </sql-query>
    </hibernate-mapping>

以下は、私が返したいクラスです:

public class PositionTemplateUpdateCascadeResult
{
    public int UpdatedPositionsCount { get; set; }
}

MSSQL Studio でプロシージャを次のように実行すると:

   EXEC [CASCADE_POSITIONTEMPLATE_PERMISSIONS]  15

私は次のことを得る

ここに画像の説明を入力

他に必要なものがあれば教えてください。


編集:戻りクラスを削除したときに、この作業を行うことができました:次のマッピングは正しく機能します:

<hibernate-mapping default-cascade="none" xmlns="urn:nhibernate-mapping-2.2" 
    assembly="StudentVoiceGroups.Entities" namespace="StudentVoiceGroups.Entities" >
<sql-query name="CASCADE_POSITIONTEMPLATE_PERMISSIONS" cacheable="false">            
      exec CASCADE_POSITIONTEMPLATE_PERMISSIONS :PositionTemplateId
</sql-query>
</hibernate-mapping>

戻り値のクラスは、テーブルにマップされたエンティティにする必要がありますか? 私の場合、それは単純なクラスです。私は、戻り値のクラスは、私たちが使用するのと同じように使用されるという意見でしたResultTransformer.

4

1 に答える 1

1

HBMファイルでクエリを正しく定義していない可能性があります。これを試して:

<hibernate-mapping default-cascade="none" xmlns="urn:nhibernate-mapping-2.2"
  assembly="StudentVoiceGroups.Entities" namespace="StudentVoiceGroups.Entities" >
  <sql-query name="CASCADE_POSITIONTEMPLATE_PERMISSIONS" cacheable="false">
    <return alias="result" class="YourNamespace.PositionTemplateUpdateCascadeResult, YourNamspaceAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
        <return-property name="UpdatedPositionsCount" column="UpdatedPositionsCount" />
    </return>
    exec CASCADE_POSITIONTEMPLATE_PERMISSIONS @PositionTemplateId=?
  </sql-query>
</hibernate-mapping>

このSOの質問への回答で似たようなものを使用したので、うまくいくはずです。

編集:return要素については、完全修飾された戻り型があることを確認してください(これには、完全修飾されたアセンブリ名と正しいバージョン番号が含まれます)。

于 2011-10-11T17:06:42.507 に答える