我在使用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调用函数和过程非常相似。然后我发现(同时也是in 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中这样做的方法。 (但我读过这表明你的设计很糟糕) 我该怎么办?我完全迷失了...... 我该如何解决?我应该改变程序以其他方式返回我的值吗?
谢谢, 奥斯卡
答案 0 :(得分:1)
存储过程的签名与您调用它的方式不匹配。你必须将其称为“呼叫BookBed(?,?,?)”。另请注意,它只需要3个参数,而不是4个。