首页 文章

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

提问于
浏览
0

同事们,您能帮助我使用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 回答

  • 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>
    

相关问题