我有以下程序:
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个参数。感谢
答案 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);
很有效!