您的位置:首页 > 其它

Hibernate如何调用存储过程

2016-12-07 13:42 471 查看
Connection   con   =   session.connect();     

  CallableStatement   proc   =   null;     

  con   =   connectionPool.getConnection();     

  proc   =   con.prepareCall("{   call   set_death_age(?,   ?)   }");     

  proc.setString(1,   XXX);     

  proc.setInt(2,   XXx);     

  ...   

  proc.execute();     

  session.close(); 

hibernate中调用存储过程的示范代码- -

                                      

如果底层数据库(如Oracle)支持存储过程,也可以通过存储过程来执行批量更新。存储过程直接在数据库中运行,速度更加快。在Oracle数据库中可以定义一个名为batchUpdateStudent()的存储过程,代码如下:

create or replace procedure batchUpdateStudent(p_age in number) as

begin

update STUDENT set AGE=AGE+1 where AGE>p_age;

end;

以上存储过程有一个参数p_age,代表学生的年龄,应用程序可按照以下方式调用存储过程:

tx = session.beginTransaction();

Connection con=session.connection();

String procedure = "{call batchUpdateStudent(?) }";

CallableStatement cstmt = con.prepareCall(procedure);

cstmt.setInt(1,0); //把年龄参数设为0

cstmt.executeUpdate();

tx.commit();

在以上代码中,我用的是Hibernate的 Transaction接口来声明事务,而不是采用JDBC API来声明事务。

 存储过程中有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程:     

  代码内容   

  tx   =   session.beginTransaction();       

  Connection   con=session.connection();       

  String   procedure   =   "{call   batchUpdateCustomer(?)   }";       

  CallableStatement   cstmt   =   con.prepareCall(procedure);       

  cstmt.setInt(1,0);   //把年龄参数设为0       

  cstmt.executeUpdate();       

  tx.commit();      

 

CREATE  procedure selectAllUsers  

DYNAMIC RESULT SETS 1 

BEGIN  

      DECLARE temp_cursor1 CURSOR  WITH RETURN TO CLIENT  FOR  

      SELECT * FROM  test;    

      OPEN temp_cursor1; 

END;

映射文件中关于存储过程内容如下

<hibernate-mapping package="com.unmi.vo"> 

    <class name="Test" table="TEST"> 

     ............ 

    </class>

    <sql-query callable="true" name="selectAllUsers"> 

<return alias="aa" class="Test"> 

    <return-property name="oborqt" column="OBORQT"/> 

    <return-property name="moorqt" column="MOORQT"/> 

    <return-property name="roschn" column="ROSCHN"/> 

    <return-property name="plandate" column="PLANDATE"/> 

</return> 

{ ? = call selectAllUsers() } 

    </sql-query> 

</hibernate-mapping>

{ ? = call selectAllUsers() } 也可以写成{ call selectAllUsers() }, 

如果有参数就写成 

{ ? = call selectAllUsers(?,?,?) } 

代码中对query设置相应位置上的值就OK

Java调用关键代码如下 

       

  Session session = HibernateUtil.currentSession(); 

  Query query = session.getNamedQuery("selectAllUsers"); 

  List list = query.list(); 

  System.out.println(list);

要求你的存储过程必须能返回记录集,否则要出错 

如果你的存储过程是完成非查询任务就应该在配置文件用以下三个标签 

  <sql-insert callable="true">{call createPerson (?, ?)}</sql-insert> 

  <sql-delete callable="true">{? = call deletePerson (?)}</sql-delete> 

  <sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>

有一点不好的地方就是调用存储过程获取记录集时,不能对Query使用 

setFirstResult(int)和setMaxResults(int)方法来分页
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: