同事们,您能帮助我使用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方法是否适合调用具有多个输出参数的存储过程?
Update
我有一个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:无法在org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123)在org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(提取的ResultSet StandardSQLExceptionConverter.java:49)org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)at org位于org.hibernate.loader.Loader.getResultSet的org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:76)的.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:130) (Loader.java:2066)org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1863)位于org.hibernate.loader.Loader的org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839) . 在org.hibernate.loader.Loader.doQueryAndInitializ上执行doQuery(Loader.java:910) egonLazyCollections(Loader.java:355)位于org.hibernate.loader.doList(Loader.java:2554)org.hibernate.loader.doList(Loader.java:2540)org.hibernate.loader.Loader上的org.hibernate.loader.Loader.doList(Loader.java:2540)位于org.hibernate的org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:353)org.hibernate.loader.Loader.list(Loader.java:2365)的.listIgnoreQueryCache(Loader.java:2370) . org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:141)中的org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:311)中的internal.SessionImpl.listCustomQuery(SessionImpl.java:1873)引起: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)at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:332)at org.hibernate.dialect.AbstractTransactSQLDialect.getResultSet(AbstractTransactSQLDialect.j ava: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)]]>
但没有成功 .
我的映射有什么问题?
UPDATE 1
添加了{}来调用程序 . 它看起来像是有效的
<![CDATA[{CALL Product_Create (:@IN$PassID, :@IN$Amount)}]]>
1 回答
用
getNamedQuery()
调用它 .