当前位置: 首页 > 面试题库 >

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

乌俊健
2023-03-14
问题内容

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



 类似资料:
  • 问题内容: 我已经在 MySQL存储过程 e中编写了一些逻辑。我正在将 spring boot与hibernate一起使用 。我有一个使用 IN OUT 参数的登录过程。从我的登录过程中,我想将消息传递给用户。但是我不知道如何在Spring Boot中调用存储过程。我的代码在下面。 我的登录过程是 我用过像 在我的登录控制器中,我想调用我的过程,以便可以将我的用户转发到仪表板。如果用户输入了错误的

  • 问题内容: 我可以使用Hibernate条件来调用存储过程吗? 问题答案: 请参阅参考文档中的使用存储过程进行查询。 映射的查询这样来称呼。 映射查询可以返回实体。

  • 问题内容: 我试图使用Hibernate从Java调用Oracle9i DB中的遗留存储函数。该函数的声明如下: 经过几次失败的尝试和广泛的谷歌搜索之后,我在Hibernate论坛上发现了该线程,该线程建议了如下映射: 我执行它的代码是 结果日志是 任何提示我在做什么错?还是调用此存储函数的更好方法? 更新: 尝试@axtavt的建议时,出现以下错误: 该函数确实进行了大量的插入/更新,因此我想运

  • 下面是我的Oracle存储过程, 我得到以下异常:hibernate:{CALL REPORT_HIBERNATE(?)}org.hibernate.exception.GenericJDBcException:无法执行查询...并且由:java.sql.sqlException:无效的列索引引起 Plz让我知道在Spring中我将如何使用Hibernate注释调用这个存储过程??

  • 问题内容: 我想使用设置实体。 我尝试了以下操作,但结果始终是(我想是因为该列始终是): 似乎忽略了。 如何使用某实体引用实体? 问题答案: 被忽略,因为它仅可替代。而且那个不用于关系映射。 但是您可以改为使用它,它存在于集合中: 要访问原始对象,可以使用特定的吸气剂:

  • 问题内容: 我有一个基本上从表中返回全部数据的函数。我该如何实现批量提取,以便一次将批量返回60,000行返回数据。 以下逻辑适用于这种情况吗? http://javainnovations.blogspot.com/2008/07/batch-insertion-in- hibernate.html 问题答案: 在中,使用参数设置批量大小