当前位置:首页 » 存储配置 » hibernate存储过程结果集

hibernate存储过程结果集

发布时间: 2024-03-27 00:27:25

Ⅰ hibernate调用存储过程

hibernate3.0以上提供了两种方式执行存储过程。

第一种 :用JDBC 方式

Session session =HibernateSessionFactory.getSession(); //获取hibernate会话

Connection conn = session.connection(); // 用session对象获取连接

ResultSet rs =null;

try
{
CallableStatement call = conn.prepareCall("{Call pro_getManager(?,?)}");

call.setString(1, "admin");
call.setString(2, "admin");
rs = call.executeQuery();

}
catch (Exception e)
{
e.printStackTrace();
}finally
{

rs.close();//关闭
session.close();//关闭连接
HibernateSessionFactory.closeSession(); //关闭会话
}

这种方式本人感觉与hibernate结合不很紧密,还难以控制,还要自己控制关闭

第二种: 用hibernate中sqlQuery 接口执行,其实与执行sql没有两样。

Session session =HibernateSessionFactory.getSession(); //获取hibernate会话

String procName="{Call pro_getManager(?,?) }";

SQLQuery query = session.createSQLQuery(proc);
query.setString(0, "admin");
query.setString(1, "admin");
List list =query.list();

session.close();

HibernateSessionFactory.closeSession();

Ⅱ 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: 已生成用于更新的结果集。”

Ⅲ hibernate调用存储过程问题

调用存储过程可以不写配置文件,直接在类中搞定! 有问题可以网络Hi 我!~
例子
public void saveStoredProcere(final String adminId, final String menuId, final String toolbars) {
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
SQLQuery sqlQuery = session.createSQLQuery("{call P_SaveOperatorPopedom(?,?,?)}");
sqlQuery.setString(0, adminId);
sqlQuery.setString(1, menuId);
sqlQuery.setString(2, toolbarsXML);
sqlQuery.executeUpdate();
return null;
}
});
}

重点是这个写法 session.createSQLQuery("{call P_SaveOperatorPopedom(?,?,?)}");
我这边用的是spring提供的HibernateDaoSupport
请采纳答案,支持我一下。

Ⅳ Hibernate 调用存储过程 该语句没有返回结果集

修改存储过程试试:
alter procere test()
as
SET NOCOUNT ON --加上这句话;有的出现这个问题,加上之后问题解决了;嘿嘿

java中使用hibernate怎么调用oracle中带有out类型参数的存储过程 如procere proc1(arg1 out number)

给你一段

一:无返回值的存储过程
存储过程为:
CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS
BEGIN
  INSERT INTO HYQ.B_ID (I_ID,I_NAME) S (PARA1, PARA2);
END TESTA;
然后呢,在java里调用时就用下面的代码:
package com.hyq.src;

import java.sql.*;
import java.sql.ResultSet;

public class TestProcereOne {
public TestProcereOne() {
}
public static void main(String[] args ){
    String driver = "oracle.jdbc.driver.OracleDriver";
    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";
    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;
    CallableStatement cstmt = null;

    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");
      CallableStatement proc = null;
      proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");
      proc.setString(1, "100");
      proc.setString(2, "TestOne");
      proc.execute();
    }
    catch (SQLException ex2) {
      ex2.printStackTrace();
    }
    catch (Exception ex2) {
      ex2.printStackTrace();
    }
    finally{
      try {
        if(rs != null){
          rs.close();
          if(stmt!=null){
            stmt.close();
          }
          if(conn!=null){
            conn.close();
          }
        }
      }
      catch (SQLException ex1) {
      }
    }
}
}
当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。

二:有返回值的存储过程(非列表)
存储过程为:
CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS
BEGIN
  SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;
END TESTB;
在java里调用时就用下面的代码:
package com.hyq.src;

public class TestProcereTWO {
public TestProcereTWO() {
}
public static void main(String[] args ){
    String driver = "oracle.jdbc.driver.OracleDriver";
    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;
    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");
      CallableStatement proc = null;
      proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");
      proc.setString(1, "100");
      proc.registerOutParameter(2, Types.VARCHAR);
      proc.execute();
      String testPrint = proc.getString(2);
      System.out.println("=testPrint=is="+testPrint);
    }
    catch (SQLException ex2) {
      ex2.printStackTrace();
    }
    catch (Exception ex2) {
      ex2.printStackTrace();
    }
    finally{
      try {
        if(rs != null){
          rs.close();
          if(stmt!=null){
            stmt.close();
          }
          if(conn!=null){
            conn.close();
          }
        }
      }
      catch (SQLException ex1) {
      }
    }
}
}

}
注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。

三:返回列表
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,
1, 建一个程序包。如下:
CREATE OR REPLACE PACKAGE TESTPACKAGE  AS
TYPE Test_CURSOR IS REF CURSOR;
end TESTPACKAGE;
2,建立存储过程,存储过程为:
CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS
BEGIN
    OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;
END TESTC;
可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。
在java里调用时就用下面的代码:
package com.hyq.src;
import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;

public class TestProcereTHREE {
public TestProcereTHREE() {
}
public static void main(String[] args ){
    String driver = "oracle.jdbc.driver.OracleDriver";
    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;

    try {
      Class.forName(driver);
      conn = DriverManager.getConnection(strUrl, "hyq", "hyq");

      CallableStatement proc = null;
      proc = conn.prepareCall("{ call hyq.testc(?) }");
      proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
      proc.execute();
      rs = (ResultSet)proc.getObject(1);

      while(rs.next())
      {
          System.out.println("<tr><td>

热点内容
截取字符串java 发布:2024-11-27 18:34:09 浏览:331
安卓导航怎么会黑屏 发布:2024-11-27 18:17:19 浏览:394
编译后代码放在单片机哪个位置 发布:2024-11-27 18:12:01 浏览:458
linux红帽安装 发布:2024-11-27 18:01:53 浏览:827
手机编程蓝牙 发布:2024-11-27 17:55:39 浏览:385
创维云电视怎么升级安卓系统 发布:2024-11-27 17:55:31 浏览:354
theisle游戏服务器搭建 发布:2024-11-27 17:47:43 浏览:210
xshell解压 发布:2024-11-27 17:35:14 浏览:359
ftp服务器管理方法 发布:2024-11-27 17:24:48 浏览:975
微信视频为什么要缓存 发布:2024-11-27 17:18:18 浏览:250