Hibernate调用存储过程示例(有参数,返回结果集)

时间:2022-09-29 09:31:20

1、存储过程

CREATE PROCEDURE `CrossDayNumDgl`(Mon VARCHAR(10),areacode VARCHAR(50),OwnerName varchar(50),MonitorName VARCHAR(50),supplyName VARCHAR(50),LimitStart int, LimitEnd int) BEGIN DECLARE sSQL VARCHAR(3000);
    DECLARE sCon VARCHAR(3000);
    DECLARE s VARCHAR(20);
    DECLARE i,iDays INT DEFAULT 1;

    ....这里省略....

    select a.FreezeMon as FreezeMon,a.meterid as meterid from Results a join tmp_table b on a.meterid =b.meterid;

END

2、数据库客户端执行存储过程如下:

CALL CrossDayNumDgl("2017-09",'00014','太原','小店','太原',0,20);

执行结果如下:
Hibernate调用存储过程示例(有参数,返回结果集)

3、java代码通过hibernate调用存储过程

//调用存储过程
SQLQuery query =   this.getCurrentSession().createSQLQuery("{CALL CrossDayNumDgl(?,?,?,?,?,?,?)}");
//传参
query.setString(0,"2017-09");
query.setString(1, "00014");
query.setString(2, "太原");
query.setString(3, "小店");
query.setString(4, "太原");
query.setInteger(5, 0);
query.setInteger(6, 20);


//查询结果集,注意每一行为Object[]数组,每一列为Object     
List<Object[]> list = query.list();
if(list != null && list.size() > 0){
    //遍历取每一行数据
    for (Object[] obj : list) {
        //取每一列
        System.out.println("FreezeMon:" + obj[0].toString());
        System.out.println("meterid:" + obj[1].toString());

    }
}

打印结果:
FreezeMon:2017-09
meterid:0351-09768

4、hibernate取出存储过程的输出参数

//调用存储过程
ProcedureCall pc = this.getCurrentSession().createStoredProcedureCall("CrossDayNumDgl");
//设置输入参数
pc.registerParameter("Mon", String.class,  ParameterMode.IN);
//设置输出参数
pc.registerParameter("cnt", Long.class,  ParameterMode.OUT);
//获取输出参数的值
long cnt = (Long)pc.getOutputs().getOutputParameterValue("cnt");

5、关于可以同时获取结果集和输出参数的方法我还没有想到好的办法
还有不是我们系统不暴露connection,所以无法通过CallableStatement 去执行相关操作。