【问题标题】:How to get scalar value returned from stored procedure in hibernate如何获取从休眠中的存储过程返回的标量值
【发布时间】:2015-08-24 06:24:00
【问题描述】:

我无法从我的存储过程中获得标量 int 值。

我的存储过程返回标量值 0 或 -1

    CREATE PROCEDURE MY_PROC
     @ID     BIGINT
AS
     IF EXISTS ( SELECT NULL FROM USER_TABLE WHERE ID = @ID )
           RETURN 0
     ELSE
           RETURN -1
GO

代码:

    SQLQuery query = null;
    {
        query = session.createSQLQuery("{CALL MY_PROC(:ID)}");
        query.setParameter("ID", 1);            
        Object status =query.uniqueResult();
        System.out.println(status.toString()); 
     }

堆栈跟踪:

    WARN: SQL Error: 0, SQLState: null
Aug 24, 2015 11:15:50 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: The statement did not return a result set.
org.hibernate.exception.GenericJDBCException: could not extract ResultSet
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:91)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2066)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1863)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839)
    at org.hibernate.loader.Loader.doQuery(Loader.java:910)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
    at org.hibernate.loader.Loader.doList(Loader.java:2554)
    at org.hibernate.loader.Loader.doList(Loader.java:2540)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
    at org.hibernate.loader.Loader.list(Loader.java:2365)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:353)
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1909)
    at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:311)
    at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:141)
    at org.hibernate.internal.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:966)
    at com.hooks.Hook.preHook(Hook.java:39)
    at com.hooks.Hook.main(Hook.java:24)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The statement did not return a result set.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:392)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:338)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:185)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:160)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:281)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)
    ... 16 more

据我了解,此过程返回标量值而不是结果集,因此休眠不允许从存储过程返回标量值。 Hibernate 只能获取从存储过程返回的 resultSet。 Hibernate reference doc

【问题讨论】:

    标签: java database hibernate stored-procedures


    【解决方案1】:

    AS 之后添加 SET NOCOUNT ON 。添加这将告诉 sql server 不要返回修改记录的数量。请参阅this 问题它非常有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      相关资源
      最近更新 更多