1. Hibernate 调用存储 (hibernate 定制查询)

Hibernate 调用存储过程

(hibernate 定制查询    <sql-query>      )

案例:
    通过调用存储过程,返回不同类别的统计结果,这里的结果需要与一个序列化类对应,使用序列化类对应的Hibernate配置文件来调用存储过程。
    存储过程名称:pro_templeave(?,?,?,?,?,?,?) 【?表示参数】。

    Hibernate的配置文件:
    ......
    <hibernate-mapping>
    <class name="com.oapms.model.AttendleavePro" table="" catalog="">
        <id name="id" type="java.lang.Integer">                //必须要有主键
            <column name="reqid" />
            <generator class="native" />
        </id>
        <property name="belong" type="java.lang.String">
            <column name="belong" length="45" />
        </property>
        <property name="scount" type="java.lang.String">
            <column name="scount" length="45" />
        </property>
        <property name="stype" type="java.lang.String">
            <column name="stype" length="45" />
        </property>
                      //去指定一个对应关系, 其实 上边的<class>标签 和<sql-query>标签是一一对应的。
                      //return 标签是存储过程 每组返回值,各个列  对应 com.oapms.model.AttendleavePro类的那个属性
        <loader query-ref="pro_templeave"></loader>                
    </class>

    <sql-query name="pro_templeave" callable="true">
    <return alias="AttendleavePro" class="com.oapms.model.AttendleavePro">     //alias 是别名的意思
          <return-property name="id" column="reqid"/>
           <return-property name="belong" column="reqbelong"/>
           <return-property name="scount" column="scount"/>
           <return-property name="stype" column="leavetype"/>
    </return>
    {?=call pro_templeave(?,?,?,?,?,?,?)}
    </sql-query>

</hibernate-mapping>

    调用存储过程:
    ......
       public List getStatisticsList(String parentid, String belong,String begindate,String enddate,int flag,String name,int oper,int which){
        List statisticsList = new ArrayList();
        try{
            String procedure=“”;
            if(which==1){
                //请假统计的存储过程
                procedure = "pro_templeave";
            }else{
                //考勤统计的存储过程
                procedure = "pro_tempvalue";
            }
            Session session = HibernateSessionFactory.getSession();
           //1.指定一个查询, getNamedQuery(procedure).传入的值,将会被配置文件,
          //           告诉配置配置文件去调用哪个存储过程,及存储过程如何的封装
           //2.调用存储过程时,要给存储过程传递参数 0-6 一共给存储过程返回了七个参数值。
            List tmplist = session.getNamedQuery(procedure).setString(0, parentid).setString(1, belong)
                .setString(2, begindate).setString(3, enddate).setInteger(4, flag).setString(5, name)
                .setInteger(6, oper).list();

            HibernateSessionFactory.closeSession();

            return tmplist;
            }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }
    注意: 调用存储过程必须返回结果集,而且必须要有Id值。

posted on 2014-01-03 21:30  fantiejun0436  阅读(147)  评论(0)    收藏  举报

导航