• hibernate 调用存储过程


    笔者参考原文:http://www.iteye.com/topic/176032

    使用hibernate 调用存储过程。

    public class StuInfo {
    	private int id;
    	private String stuName;
    	private String stuNo;
    	private int stuAge;
    	private String stuId;
    	private String stuSeat;
    	private String stuAddress;
    setters();getters();
    }

    对应的数据库表:

    if exists(select * from sysobjects where name='stuInfo')
    drop table stuInfo
    create table stuInfo /*创建学员信息表**/
    (
     stuName varchar(20) not null,-- 姓名,非空
     stuNo char(6) not null,-- 学号,非空
     stuAge int not null,-- 年齡,int 默认为4个长度
     stuId numeric(18,0),
     stuSeat smallint ,-- 坐位车,使用自增
     stuAddress text -- 住址 可以为空
    )
    -- 给stuInfo添加一列
    alter table stuInfo add id int identity(1,1) primary key;

    创建存储过程:

    -- 存储过程
    if exists(select name from sysobjects where name='proc_stuInfo' and type='p')
    drop proc proc_stuInfo
    go
    create proc proc_stuInfo
    as
     select * from stuInfo
    go
    -- 调用存储过程
    exec proc_stuInfo;

    在hibernate 中调用存储过程的几种方法。

    第一种:命名查询

      <sql-query name="getStuInfo" callable="true">  
         <return alias="stuInfo" class="com.hkrt.domain.StuInfo">  
            <return-property name="id" column="id" />  
    		<return-property name="stuName" column="stuName" />
    		<return-property name="stuAge" column="stuAge" />
    		<return-property name="stuNo" column="stuNo"/>
    		<return-property name="stuSeat" column="stuSeat" />
    		<return-property name="stuAddress" column="stuAddress"/>
    		<return-property name="stuId" column="stuId"/>
         </return>  
         {call proc_stuInfo()}  
      </sql-query> 

    	List li=session.getNamedQuery("getStuInfo").list();  
    		System.out.println(li.get(0));
    第二种:类型于jdbc

    	System.out.println("jdbc 调用-------------");
    		Connection conn = session.connection();   
    		ResultSet rs =null;  
    		CallableStatement call;
    		try {
    			call = conn.prepareCall("{Call proc_stuInfo()}");
    			rs = call.executeQuery(); 
    		   	while(rs.next()){
    		   		System.out.println(rs.getString(1));
    		   		System.out.println(rs.getString(2));
    		   		System.out.println(rs.getString(3));
    		   		System.out.println(rs.getString(4));
    		   		System.out.println(rs.getString(5));
    		   		System.out.println(rs.getString(6));
    		 		System.out.println(rs.getString(7));
    		   		System.out.println("------------------");
    		   	}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}  


    第三种:最简单的一种

    	SQLQuery query =  session.createSQLQuery("{call proc_stuInfo()}").addEntity(StuInfo.class);  
    	List list =query.list(); 
    	System.out.println(list.get(0));

    注:在第三种调用时,一定要加上addEntity();否则没有数据返回。

    hibenate 调用带参的存储程

    -- 带参数据的存储过程
    if exists(select name from sysobjects where name='proc_find_stu' and type='p')
    drop proc  proc_find_stu
    go
    create proc  proc_find_stu(@startId int,@endId int)
    as
     select * from stuInfo where id between @startId and @endId;
    go
    exec proc_find_stu 1,4;

    	/**hibernate 调用带参的存储过程*/
    	@SuppressWarnings("unchecked")
    	@Test
    	public void msTest2(){
    		SessionFactory sf = SessionFactoyUtil.getSessionFactory();
    		Session session = sf.openSession();
    		SQLQuery query =   session.createSQLQuery("{CALL proc_find_stu(?,?)}").addEntity(StuInfo.class);
    		query.setLong(0, 2);  
    		query.setLong(1, 4);  
    		List<StuInfo> list =query.list(); 
    		 for(int i =0;i<list.size();i++){
    			 System.out.println(list.get(i));
    		 }
    	}


    结果信息:
    Hibernate: 
        {CALL proc_find_stu(?,?)}
    StuInfo [id=2, stuAddress=北京, stuAge=12, stuId=123456789012345687, stuName=李四, stuNo=112345, stuSeat=2]
    StuInfo [id=4, stuAddress=北京, stuAge=12, stuId=123456789012345688, stuName=王五, stuNo=112345, stuSeat=3]



  • 相关阅读:
    我的又一个web2.0作品
    AjaxPro使用注意事项与返回数据库中数据时2.0和3.5/4.0的区别(我的心得)
    AjaxPro入门使用方法
    SQLHelper的简单应用,高手绕道,写出最近用的一个类,仅供初学者参考
    Notepad++插件NPPExec编译运行C++、JAVA和Python代码
    在Ubuntu 18.04 LTS上搭建SS并启用BBR
    Linux 目录和文件管理
    chap06
    三层交换机的VLAN划分
    传输协议
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218370.html
Copyright © 2020-2023  润新知