【问题标题】:How to call MS SQL stored procedures with more than one output parameters using Hibernate 4?如何使用 Hibernate 4 调用具有多个输出参数的 MS SQL 存储过程?
【发布时间】:2016-01-02 06:13:16
【问题描述】:

同事,您能帮我使用 Hibernate 4 调用带有两个输入和两个输出参数的 MS SQL 2008 存储过程吗? 存储过程如下:

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' 附近的语法不正确。例外 在线程“主”org.hibernate.exception.SQLGrammarException:可以 不提取 ResultSet 在 org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) 在 org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:130) 在 org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:76) 在 org.hibernate.loader.Loader.getResultSet(Loader.java:2066) 在 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1863) 在 org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839) 在 org.hibernate.loader.Loader.doQuery(Loader.java:910) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) 在 org.hibernate.loader.Loader.doList(Loader.java:2554) 在 org.hibernate.loader.Loader.doList(Loader.java:2540) 在 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370) 在 org.hibernate.loader.Loader.list(Loader.java:2365) 在 org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:353) 在 org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1873) 在 org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:311) 在 org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:141) 引起:com.microsoft.sqlserver.jdbc.SQLServerException:不正确 '@P0' 附近的语法。在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350) 在 com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:332) 在 org.hibernate.dialect.AbstractTransactSQLDialect.getResultSet(AbstractTransactSQLDialect.java:226) 在 org.hibernate.dialect.SQLServerDialect.getResultSet(SQLServerDialect.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)}]]>

【问题讨论】:

    标签: java sql-server hibernate


    【解决方案1】:

    使用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>
    

    【讨论】:

    • 乔迪卡斯蒂利亚,感谢您的回复。我需要创建映射文件吗?
    • 是的,映射文件或者java注解类...你必须告诉hibernate哪个表对应返回的对象
    • 但是我没有与带有输出过程参数(@Return 和@ProdID)的返回对象对应的表。过程只返回两个参数(它不是表或游标)
    • 所以为视图创建一个映射文件,并带有相应的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多