hibernate 5调用MSSQL 8存储过程错误

时间:2018-01-26 09:54:44

标签: sql-server hibernate stored-procedures

我有以下程序:

  DECLARE @rec INT, @ret INT ;
EXECUTE @ret = udo_ui.PR_GetDocuments
   @iTotRecCount = @rec OUTPUT,
   @iFirstRecNo = 18,
   @iRetRecCount = 50,
   @department_id = 181 -- int
;
SELECT @ret,@rec;

我想在Hibernate中调用它(理想情况下是在spring数据中)

 StoredProcedureQuery storedProcedure = manager.createStoredProcedureQuery("udo_ui.PR_GetDocuments")
                    .registerStoredProcedureParameter("iTotRecCount", Integer.class, ParameterMode.OUT)
                    .registerStoredProcedureParameter("iFirstRecNo", Integer.class, ParameterMode.IN)
                    .registerStoredProcedureParameter("iRetRecCount", Integer.class, ParameterMode.IN)
                    .registerStoredProcedureParameter("department_id", Integer.class, ParameterMode.IN);

            storedProcedure
                    .setParameter("iFirstRecNo", 18)
                    .setParameter("iRetRecCount", 50)
                    .setParameter("department_id", 181);

            boolean b = storedProcedure.execute();
            System.out.println("B=" + b + " " + storedProcedure.getOutputParameterValue("iTotRecCount"));

但我无法获取参数值,而execute()方法返回false。如何使它工作?我需要在select中获得结果集和2个参数。感谢

1 个答案:

答案 0 :(得分:0)

我认为这个解决方案可能对很多人有帮助。所以问题是当hibernate向mssql服务器发送请求时,它按位置使用参数,但不使用名称。因此,如果您的过程有3个参数,则应该按顺序注册参数,就像过程定义中的那些参数一样。所以在我的情况下,解决方案是交换寄存器参数,使它们遵循程序中的参数顺序。所以如果我这样做

.registerStoredProcedureParameter("iTotRecCount", Integer.class, ParameterMode.OUT)
.registerStoredProcedureParameter("iRetRecCount", Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter("iFirstRecNo", Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter("department_id", Integer.class, ParameterMode.IN);

而不是

.registerStoredProcedureParameter("iTotRecCount", Integer.class, ParameterMode.OUT)
.registerStoredProcedureParameter("iFirstRecNo", Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter("iRetRecCount", Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter("department_id", Integer.class, ParameterMode.IN);

很有效!