当前位置: 首页 > 知识库问答 >
问题:

如何使用Hibernate4调用具有多个输出参数的MS SQL存储过程?

劳高爽
2023-03-14

同事们,您能帮我用Hibernate4调用MSSQL2008存储过程,其中包含两个输入和两个输出参数吗?存储过程如下所示:

PROCEDURE Product_Create(
        @Return  int  output,
        @ProdID numeric(18,0)  output,

        @PassID numeric(18,0),
        @Amount numeric(18,2))

我正在尝试使用Session.CreateSQLQuery方法调用过程:

Query qr = session.createSQLQuery("{? = Product_Create (:PassID, :Amount")});
qr.setParameter("PassID", new BigInteger("999999999"));
qr.setParameter("Amount", new BigDecimal("87384738"));

但也有一些不明朗的时刻:

  1. 如何注册多个输出参数?
  2. Session.CreateSQLQuery方法是否适合调用具有多个输出参数的存储过程?

更新

我有一个MS SQL过程

PROCEDURE Product_Create(
        @Return  int  output,
        @ProdID numeric(18,0)  output,

        @IN$PassID numeric(18,0),
        @IN$Amount numeric(18,2))

并具有映射文件:

<hibernate-mapping>
    <sql-query name="Product_Create" callable="true">
        <return-scalar column = "Return" type="int"/>
        <return-scalar column = "ProdID" type="long"/>
        <![CDATA[CALL IProduct_Create (:@IN$PassID, :@IN$Amount)]]>
  </sql-query>
</hibernate-mapping>

运行应用程序时收到异常:

警告:[Tue-06 10:11:39,374]jdbc.spi.sqlexceptionhelper-SQL错误:102,SqlState:S0001错误:[Tue-06 10:11:39,374]jdbc.spi.sqlexceptionhelper-“@p0”附近语法不正确.线程“main”org.hibernate.Exception.sqlgrammarexception异常:无法提取org.hibernate.Exception.internal.sqlstateconversiondelegate.convert(Sqlstateconversiondelegate.java:123)在org.hibernate.Exception.internal.standardsqlexceptionconverter.convert(Standardsqlexceptionconverter.49)在org.hibernate.engine.jdbc.spi.sqlexceptionhelper.convert(Sqlexceptionhelper.126)在eNonLazyCollections(loader.java:355)在org.hibernate.loader.loader.dolist(loader.java:2554)在org.hibernate.loader.loader.dolist(loader.java:2540)在org.hibernate.loader.loader.list(loader.java:2540)在org.hibernate.loader.loader.list(loader.java:2365)在org.hibernate.loader.loader.list(loader.java:2365)在在com.microsoft.sqlserver.jdbc.sqlserverexception.makefromdatabaseerror(sqlserverexception.java:216)在com.microsoft.sqlserver.jdbc.sqlserverstatement.getnextresult(sqlserverstatement.java:1515)在com.microsoft.sqlserver.jdbc.sqlserverstatement.doexecutepreparedstatement(sqlserver.jdbc.sqlserverstatement.404)在Ava:226)位于org.hibernate.dialt.SqlServerDialt.GetResultSet(SqlServerDialt.java:42)位于org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.Extract(ResultSetReturnImpl.java:121)...16其他

我试着在

  <![CDATA[CALL IProduct_Create (:@IN$PassID, :@IN$Amount)]]>

但没有成功。

我的映射出了什么问题?

更新1

在调用过程中添加了方括号{}。当呼叫看起来像

 <![CDATA[{CALL Product_Create (:@IN$PassID, :@IN$Amount)}]]>

共有1个答案

宗翔宇
2023-03-14

使用getNamedQuery()调用它。

Query query = session.getNamedQuery("product_create")
    .setParameter("PassID", new BigInteger("999999999"))
    .setParameter("Amount", new BigDecimal("87384738"));

List result = query.list();  // here you have DTO List i.e. List<Product>
 类似资料:
  • 问题内容: 我在SQL Server 2008 R2中有一个Oracle链接服务器。我需要执行Oracle存储过程(在第一个过程中使用输出参数,在第二个过程中使用输入参数): 我没有找到有关此问题的完整文档,只有带有无参数选择/非选择过程的简单示例,并且想知道如何调用这些过程,具有内部select的过程以及具有基本参数类型的多参数过程。 问题答案: 它应该像这样工作: 如果您有几个参数,则可能如下

  • 问题内容: 我已经编写了一个VBScript函数来调用存储过程。过去,我编写了许多函数,这些函数使用输入参数调用存储过程,但是在这种情况下,我需要使用Output参数。 在另一个应用程序中,我使用实体框架调用完全相同的存储过程,因此该存储过程很好。 这是我的代码: adParamInput, 50, userId)) cmd.Parameters.Append(cmd.CreateParamete

  • 尝试调用MSSQL存储过程。过程基本上是这样的:使用[DATABASE]GO SET ANSI _ NULLS ON GO SET QUOTED _ IDENTIFIER ON GO 更改过程。[stored procedure](@ username varchar(10))as 从表名中选择用户名 输出是:array(0) { }这个数据库中有大量的数据。 我知道与数据库的连接是有效的,但当我

  • 问题内容: 我正在使用Sql Server2008。我的存储过程接受将近150个参数。在性能方面有什么问题吗? 问题答案: 在性能上没有错,但是闻起来可以用动态SQL更好地完成。不看代码很难说。

  • 本文向大家介绍Sql Server 存储过程调用存储过程接收输出参数返回值,包括了Sql Server 存储过程调用存储过程接收输出参数返回值的使用技巧和注意事项,需要的朋友参考一下 创建存储过程: 接收输出参数: 2,带返回值 创建存储过程: 接收返回值: 以上所述是小编给大家介绍的Sql Server 存储过程调用存储过程接收输出参数返回值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小

  • 问题内容: 我有一个来自此(google book )的mysql存储过程,一个例子是这样的: 该程序编译正常。(我在ubuntu中使用MySQL查询浏览器)。 但是,当我调用该过程时: (也在查询浏览器中) 它返回一个错误: 为什么这个例子不起作用? 问题答案: 无法复制。对我来说效果很好: 也许您应该粘贴整个错误消息,而不是对其进行汇总。