【问题标题】:How to call a stored procedure using hibernate?如何使用休眠调用存储过程?
【发布时间】:2011-06-27 18:12:08
【问题描述】:

我在使用 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

我在某处读到使用休眠调用函数和过程会非常相似。然后我发现(巧合的是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 中执行此操作的方法。 (但我读过这表明你的设计很糟糕) 我应该怎么办?我完全迷失了…… 我该如何解决?我应该更改过程以以其他方式返回我的值吗?

谢谢, 奥斯卡

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

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

    【讨论】:

    • 您好,感谢您在此处和其他问题中的回答。第一个参数是 out 参数,正如我在问题 (stackoverflow.com/questions/1703351/…) 中发布的链接中所理解的那样,它必须用于获取返回值。我将使用一个函数,就像我在做的那样,我希望我能让这些东西再次工作。再次感谢
    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 2014-03-02
    • 2019-02-20
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2012-12-06
    相关资源
    最近更新 更多