关于hibernate调用存储过程

使用hibernate调用不带参数返回值的存储过程方法

public Boolean doInHibernate(Session session)
     throws HibernateException, SQLException {
    try{
     Transaction tr = session.beginTransaction();
     SQLQuery query = session.createSQLQuery("{call CommandAdapter(?,?,?,?)}");
     query.setString(0,"ls");
     query.setInteger(1, machineid);
     query.setString(2, param);
     query.setInteger(3, 0); //
     query.executeUpdate();
     tr.commit();
          return true;
    }catch(Exception e){
     e.printStackTrace();
     return false;
    }finally{

       session.close();

   }
   }

使用hibernate调用带参数返回值的存储过程方法

在调用带参数返回值的方法时,需使用到CallableStatement对象。因此,首先得设法获取一个Connection。

获取Connection 方法:

      (1)session.connection();//此方法目前已被弃用

       (2)SessionFactoryUtils.getDataSource(sessionFactory).getConnection()

不过我在使用SessionFactoryUtils.getDataSource(sessionFactory)时,一直获取的都是空值,为此参考SessionFactoryUtils的源代码直接利用ConnectionProvider对象来获取一个Connection实例。

完整代码:

SessionFactory sessionFactory=this.getSessionFactory();
  if (sessionFactory instanceof SessionFactoryImplementor){
   ConnectionProvider cp = ((SessionFactoryImplementor) sessionFactory).getConnectionProvider();
   try {
    
    CallableStatement statement = cp.getConnection().prepareCall(   
                "{call MachineDataQuery(?,?,?,?,?,?,?,?,?,?,?,?,?,?)}"); 
    statement.setInt(1, machineId);
    statement.setInt(2, jobId);
    statement.setInt(3, partTypeId);
    statement.setInt(4, compentId);
    statement.setInt(5, opId);
    statement.setInt(6, roleId);
    statement.setInt(7, userId);
    statement.setString(8, sd);
    statement.setString(9, ed);
    statement.registerOutParameter(10, Types.FLOAT);
    statement.registerOutParameter(11, Types.FLOAT);
    statement.registerOutParameter(12, Types.FLOAT);
    statement.registerOutParameter(13, Types.FLOAT);
    statement.registerOutParameter(14, Types.FLOAT);
    statement.execute();
    System.out.println(statement.getFloat(10));
    System.out.println(statement.getFloat(11));
    System.out.println(statement.getFloat(12));
    System.out.println(statement.getFloat(13));
    System.out.println(statement.getFloat(14));
   } catch (SQLException e) {
    e.printStackTrace();
   }finally{
    cp.close();
   }
  }

ps:切记存储过程中不可有多余的print或select语句,否则会抛出异常“com.microsoft.sqlserver.jdbc.SQLServerException: 已生成用于更新的结果集。”

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值