如何使用HibernateJava调用mysql存储过程

如何使用HibernateJava调用mysql存储过程,java,mysql,hibernate,stored-procedures,Java,Mysql,Hibernate,Stored Procedures,我试图使用Hibernate-JAVA调用MySQL存储过程 当我运行以下java方法来执行该过程时,我的表被锁定,并且没有返回任何响应。但当我以mysql命令运行时,这个过程是成功的 程序: CREATE DEFINER = `root`@`%` PROCEDURE `getReceiptNumber`(IN bankcode VARCHAR(5),IN receipttype VARCHAR(20),IN curyear INT(4), IN curday INT(3),OUT seq VA

我试图使用Hibernate-JAVA调用MySQL存储过程

当我运行以下java方法来执行该过程时,我的表被锁定,并且没有返回任何响应。但当我以mysql命令运行时,这个过程是成功的

程序:

CREATE DEFINER = `root`@`%` PROCEDURE `getReceiptNumber`(IN bankcode VARCHAR(5),IN receipttype VARCHAR(20),IN curyear INT(4), IN curday INT(3),OUT seq VARCHAR(5))
BEGIN
IF EXISTS (SELECT 1 FROM receipt_number WHERE bank_code = bankcode AND receipt_type = receipttype) THEN
        IF NOT EXISTS(SELECT * FROM receipt_number WHERE bank_code = bankcode AND receipt_type = receipttype AND cur_year = curyear) THEN
            UPDATE receipt_number SET cur_year = curyear, seq_number = 0 WHERE bank_code = bankcode AND receipt_type = receipttype;
        END IF;
        IF NOT EXISTS(SELECT 1 FROM receipt_number WHERE bank_code = bankcode AND receipt_type = receipttype AND cur_year = curyear AND cur_date = curday) THEN
            UPDATE receipt_number SET cur_date = curday, seq_number = 0 WHERE bank_code = bankcode AND receipt_type = receipttype;
        END IF;
ELSE
    INSERT INTO receipt_number VALUES (bankcode,curday,curyear,receipttype,0);
END IF;
UPDATE receipt_number SET seq_number = (seq_number + 1) WHERE bank_code = bankcode AND receipt_type = receipttype;
SELECT LPAD(seq_number,5,'0') FROM receipt_number WHERE bank_code = bankcode AND receipt_type = receipttype INTO seq; 
END;
MySQL请求:

call getReceiptNumber("ABCD", "REC-PGM-BATCH",2018,42, @seq);
select @seq;
Java方法:

private String getBatchNumber(String bankCode, String receipttype, int year, int julianDay) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    String sequeceNumber = "";
    try {
        ProcedureCall call = session.createStoredProcedureCall("getReceiptNumber");
        call.registerParameter("bankcode", String.class, ParameterMode.IN).bindValue(bankCode);
        call.registerParameter("receipttype", String.class, ParameterMode.IN).bindValue(receipttype);
        call.registerParameter("curyear", Integer.class, ParameterMode.IN).bindValue(year);
        call.registerParameter("curday", Integer.class, ParameterMode.IN).bindValue(julianDay);
        call.registerParameter("seq", String.class, ParameterMode.OUT);

        ProcedureOutputs out = call.getOutputs();

        sequeceNumber = (String) out.getOutputParameterValue("seq");
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        session.flush();
        session.close();
    }

    return sequeceNumber;
}

我认为这是完全有帮助的

@NamedStoredProcedureQuery(
    name = "calculate", 
    procedureName = "calculate", 
    parameters = { 
        @StoredProcedureParameter(mode = ParameterMode.IN, type = Double.class, name = "x"), 
        @StoredProcedureParameter(mode = ParameterMode.IN, type = Double.class, name = "y"), 
        @StoredProcedureParameter(mode = ParameterMode.OUT, type = Double.class, name = "sum")
    }
)

**Use it in your program**
StoredProcedureQuery query = this.em.createNamedStoredProcedureQuery("calculate");
query.setParameter("x", 1.23d);
query.setParameter("y", 4.56d);
query.execute();
Double sum = (Double) query.getOutputParameterValue("sum");

这是普通的jdbc代码,对吗?我正在尝试使用Hibernate来实现这一点。
@NamedStoredProcedureQuery(
    name = "calculate", 
    procedureName = "calculate", 
    parameters = { 
        @StoredProcedureParameter(mode = ParameterMode.IN, type = Double.class, name = "x"), 
        @StoredProcedureParameter(mode = ParameterMode.IN, type = Double.class, name = "y"), 
        @StoredProcedureParameter(mode = ParameterMode.OUT, type = Double.class, name = "sum")
    }
)

**Use it in your program**
StoredProcedureQuery query = this.em.createNamedStoredProcedureQuery("calculate");
query.setParameter("x", 1.23d);
query.setParameter("y", 4.56d);
query.execute();
Double sum = (Double) query.getOutputParameterValue("sum");