Hibernate 调用函数及过程

本文介绍了在Hibernate中通过三种方式调用存储过程和函数的方法,包括直接获取连接、配置XML和自定义方言,并讨论了使用限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、函数

第一种方式:获得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

Connection conn = session.connection(); CallableStatement call = conn.prepareCall("{call getdeptbyid(?,?,?)}"); call.registerOutParameter(1, OracleTypes.CURSOR);// 设置输出变量类型 call.setInt(2, 10); call.setInt(3, 1); call.executeQuery(); ResultSet rs = (ResultSet) call.getObject(1); while (rs.next()) { System.out.println(rs.getString(2)); }
第二种方式:通过配置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>


Dept dept=(Dept)session.getNamedQuery("getdeptbyid").setInteger(0, 10).setInteger(1, 1).uniqueResult(); System.out.println(dept.getDname());
三、使用限制

为了在 Hibernate 中使用存储过程,你必须遵循一些规则。不遵循这些规则的存储过程将不可用。如果你仍然想使用他们,你必须通过session.connection()来执行他们。这些规则针对于不同的数据库。因为数据库提供商有各种不同的存储过程语法和语义。

对存储过程进行的查询无法使用setFirstResult()/setMaxResults()进行分页。

建议采用的调用方式是标准 SQL92:{ ? = call functionName(<parameters>) }或者{ ? = call procedureName(<parameters>) }。原生调用语法不被支持。

对于 Oracle 有如下规则:

对于 Sybase 或者 MS SQL server 有如下规则:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值