【发布时间】: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"));
但也有一些不清楚的时刻:
- 如何注册多个输出参数?
- 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