簡體   English   中英

如何使用休眠方式調用存儲過程?

[英]How to call a stored procedure using 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

我讀過某個地方,使用休眠模式調用函數和過程將非常相似。 然后,我發現(巧合地也在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個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM