使用 NHibernate 作为带有输入参数的命名查询调用存储过程

Posted

技术标签:

【中文标题】使用 NHibernate 作为带有输入参数的命名查询调用存储过程【英文标题】:Calling Stored Procedure using NHibernate as a Named Query with Input Parameters 【发布时间】:2011-10-11 15:58:38 【问题描述】:

问题描述:

我正在尝试使用输入参数执行存储过程。从 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 一样使用。

【问题讨论】:

我没有发布该过程,因为我认为命名查询映射是问题,但如果发布它会有所帮助,请告诉我 【参考方案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>

它应该可以工作,因为我在回答 to this SO question. 中使用了类似的东西

编辑:对于 return 元素,确保您具有完全限定的返回类型(这包括具有正确版本号的完全限定程序集名称)。

【讨论】:

我用新的发现更新了这个问题。上面的映射仍然给我错误。

以上是关于使用 NHibernate 作为带有输入参数的命名查询调用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

列错误中的冒号 ':' - 并非所有命名参数都已在 Nhibernate 中设置?

NHibernate - 如何使用参数值记录命名参数化查询?

在没有 .hbm 或 xml 文件的 NHibernate Fluent 映射中定义命名查询

流畅的 Nhibernate 和 hbms

模板函数与带有自动参数的命名 lambda

带输入参数的命名查询