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