1. 程式人生 > >使用hibernate 呼叫儲存過程。

使用hibernate 呼叫儲存過程。

  1. publicclass StuInfo {  
  2.     privateint id;  
  3.     private String stuName;  
  4.     private String stuNo;  
  5.     privateint stuAge;  
  6.     private String stuId;  
  7.     private String stuSeat;  
  8.     private String stuAddress;  
  1. setters();getters();  

對應的資料庫表:

  1. if exists(select * from sysobjects where
    name='stuInfo')  
  2. droptable stuInfo  
  3. createtable stuInfo /*建立學員資訊表**/  
  4. (  
  5.  stuName varchar(20) notnull,-- 姓名,非空
  6.  stuNo char(6) notnull,-- 學號,非空
  7.  stuAge intnotnull,-- 年齡,int 預設為4個長度
  8.  stuId numeric(18,0),  
  9.  stuSeat smallint ,-- 坐位車,使用自增
  10.  stuAddress text -- 住址 可以為空
  11. )  
  12. -- 給stuInfo新增一列
  13. altertable stuInfo 
    add id int identity(1,1) primarykey;  

建立儲存過程:
  1. -- 儲存過程
  2. if exists(selectnamefrom sysobjects wherename='proc_stuInfo'and type='p')  
  3. drop proc proc_stuInfo  
  4. go  
  5. create proc proc_stuInfo  
  6. as
  7.  select * from stuInfo  
  8. go  
  9. -- 呼叫儲存過程
  10. exec proc_stuInfo;  

在hibernate 中呼叫儲存過程的幾種方法。

第一種:命名查詢

  1. <
    sql-queryname="getStuInfo"callable="true">
  2.    <returnalias="stuInfo"class="com.hkrt.domain.StuInfo">
  3.       <return-propertyname="id"column="id"/>
  4. <return-propertyname="stuName"column="stuName"/>
  5. <return-propertyname="stuAge"column="stuAge"/>
  6. <return-propertyname="stuNo"column="stuNo"/>
  7. <return-propertyname="stuSeat"column="stuSeat"/>
  8. <return-propertyname="stuAddress"column="stuAddress"/>
  9. <return-propertyname="stuId"column="stuId"/>
  10.    </return>
  11.    {call proc_stuInfo()}    
  12. </sql-query>

  1. List li=session.getNamedQuery("getStuInfo").list();    
  2.     System.out.println(li.get(0));  
第二種:型別於jdbc
  1. System.out.println("jdbc 呼叫-------------");  
  2.     Connection conn = session.connection();     
  3.     ResultSet rs =null;    
  4.     CallableStatement call;  
  5.     try {  
  6.         call = conn.prepareCall("{Call proc_stuInfo()}");  
  7.         rs = call.executeQuery();   
  8.         while(rs.next()){  
  9.             System.out.println(rs.getString(1));  
  10.             System.out.println(rs.getString(2));  
  11.             System.out.println(rs.getString(3));  
  12.             System.out.println(rs.getString(4));  
  13.             System.out.println(rs.getString(5));  
  14.             System.out.println(rs.getString(6));  
  15.             System.out.println(rs.getString(7));  
  16.             System.out.println("------------------");  
  17.         }  
  18.     } catch (SQLException e) {  
  19.         e.printStackTrace();  
  20.     }    


第三種:最簡單的一種
  1. SQLQuery query =  session.createSQLQuery("{call proc_stuInfo()}").addEntity(StuInfo.class);    
  2. List list =query.list();   
  3. System.out.println(list.get(0));  

注:在第三種呼叫時,一定要加上addEntity();否則沒有資料返回。

hibenate 呼叫帶參的儲存程

  1. -- 帶引數據的儲存過程
  2. if exists(selectnamefrom sysobjects wherename='proc_find_stu'and type='p')  
  3. drop proc  proc_find_stu  
  4. go  
  5. create proc  proc_find_stu(@startId int,@endId int)  
  6. as
  7.  select * from stuInfo where id between @startId and @endId;  
  8. go  
  9. exec proc_find_stu 1,4;  

  1. /**hibernate 呼叫帶參的儲存過程*/
  2. @SuppressWarnings("unchecked")  
  3. @Test
  4. publicvoid msTest2(){  
  5.     SessionFactory sf = SessionFactoyUtil.getSessionFactory();  
  6.     Session session = sf.openSession();  
  7.     SQLQuery query =   session.createSQLQuery("{CALL proc_find_stu(?,?)}").addEntity(StuInfo.class);  
  8.     query.setLong(02);    
  9.     query.setLong(14);    
  10.     List<StuInfo> list =query.list();   
  11.      for(int i =0;i<list.size();i++){  
  12.          System.out.println(list.get(i));  
  13.      }  
  14. }  
結果資訊:
  1. Hibernate:   
  2.     {CALL proc_find_stu(?,?)}  
  3. StuInfo [id=2, stuAddress=北京, stuAge=12, stuId=123456789012345687, stuName=李四, stuNo=112345, stuSeat=2]  
  4. StuInfo [id=4, stuAddress=北京, stuAge=12, stuId=123456789012345688, stuName=王五, stuNo=112345, stuSeat=3]