如何使用hibernate调用存储过程?

我在使用hibernate和MySQL时遇到了一些问题。 我一直在阅读,但我变得更加困惑,所以我想你可以帮助我理解我接下来应该做什么。

我有一个MySQL数据库,我在其中添加了这个存储过程(感谢Stack Overflow人员)

CREATE PROCEDURE BookBed ( OUT oReservaOK boolean, pPaciente varchar(255), pHospital bigint(20)) BEGIN DECLARE NumLeitosDisponiveis INT; DECLARE dt TIMESTAMP; SET dt = (Select now()); SET NumLeitosDisponiveis = (SELECT AVAILABLEBEDCOUNT FROM HOSPITAL WHERE ID = pHospital); IF((SELECT NumLeitosDisponiveis) > 0) THEN BEGIN START TRANSACTION; INSERT INTO RESERVATION(PERSON, HOSPITAL, DATE) VALUES (pPaciente, pHospital, dt); UPDATE HOSPITAL SET AVAILABLEBEDCOUNT = AVAILABLEBEDCOUNT - 1 WHERE ID = pHospital; SET oReservaOk = true; commit; END; ELSE SET oReservaOk = false; END IF; END 

我已经阅读过使用hibernate调用函数和过程的地方非常相似。 然后我发现(同样在StackOverflow中 ),使用Hibernate从我的java应用程序执行函数的代码:

 session.doWork(new Work() { @Override public void execute(Connection connection) throws SQLException { CallableStatement call = connection.prepareCall("{ ? = call " + functionName + "(?,?,?) }"); call.registerOutParameter( 1, Types.BOOLEAN ); // or whatever it is call.setString(2, param1); call.setLong(3, param2); call.registerOutParameter( 4, Types.BOOLEAN ); // or whatever it is call.execute(); DatabaseManager.this.setResult(call.getBoolean(1)); // propagate this back to enclosing class } }); 

我尝试使用它,但我得到了不同类型的错误(这取决于我如何设置参数)。 在当前时间点,我得到“没有为参数3指定值”错误,因为我注册了输出参数。 我搜索了更多信息,但我感到困惑,因为网站有不同的方法,许多文档链接被打破(链接到JBoss网站)。

我已经读过我必须将光标作为第一个输出参数返回。 我正在寻找在MySQL中这样做的方法。 (但我读过这表明你的设计很糟糕)我该怎么办? 我完全迷失了……我怎么能解决它? 我应该更改程序以其他方式返回我的值吗?

谢谢,奥斯卡

存储过程的签名与您调用它的方式不匹配。 你必须将其称为“呼叫BookBed(?,?,?)”。 另请注意,它只需要3个参数,而不是4个。