一、函数
第一种方式:获得connection
Connection conn = session.connection(); CallableStatement call = conn.prepareCall("{?=call getemp.getempc(?)}"); call.registerOutParameter(1, OracleTypes.CURSOR);// 设置输出变量类型 call.setInt(2, 10); call.executeQuery(); ResultSet rs = (ResultSet) call.getObject(1); while (rs.next()) { System.out.println(rs.getString(3)); }对应函数包体: create or replace package body getemp is function getempc(dno number) return sys_refcursor is type emp_cursor_type is ref cursor; emp_cursor emp_cursor_type; begin open emp_cursor for select * from scott.emp where deptno=dno; return emp_cursor; end; end getemp;
第二种方式:通过配置XML <sql-query name="funtest" callable="true"> <return alias="emp" class="org.han.entity.Emp"> <return-property name="empno" column="empno"></return-property> <return-property name="ename" column="ename"></return-property> <return-property name="job" column="job"></return-property> <return-property name="mgr" column="mgr"></return-property> <return-property name="hiredate" column="hiredate"></return-property> <return-property name="sal" column="sal"></return-property> <return-property name="comm" column="comm"></return-property> <return-property name="dept" column="deptno"></return-property> <return-property name="version" column="version"></return-property> </return> {?=call getemp.getempc(?)} </sql-query>
List<Emp> emps=session.getNamedQuery("funtest").setInteger(0, 10).list(); for (Emp emp : emps) { System.out.println(emp); }
第三种方式:自定义方言
二、过程
对应的过程:
create or replace procedure getdeptbyid(d out sys_refcursor,dno number,num number ) is begin open d for select * from dept where deptno=dno and 1=num; end;第一种方式:获得connection
第二种方式:通过配置XML
<sql-query name="getdeptbyid" callable="true"> <return alias="dept" class="org.han.entity.Dept"> <return-property name="deptno" column="deptno"></return-property> <return-property name="dname" column="dname"></return-property> <return-property name="loc" column="loc"></return-property> </return> {call getdeptbyid(?,?,?)} </sql-query>
三、使用限制
对存储过程进行的查询无法使用setFirstResult()/setMaxResults()
进行分页。
对于 Sybase 或者 MS SQL server 有如下规则: