一尘不染

如何使用休眠方式调用存储过程?

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中执行此操作的方法。(但是我读过这表明您的设计不正确)我应该怎么办?我完全迷路了…我该如何解决?我应该更改程序以其他方式返回我的值吗?

谢谢,奥斯卡


阅读 244

收藏
2020-06-20

共1个答案

一尘不染

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

2020-06-20