我不确定100%,也没有测试,但是根据Hibernate的文档:
16.2.2。使用存储过程进行查询
Hibernate3通过存储过程和函数提供查询支持。以下大多数文档对于两者都是等效的。
存储过程/函数必须返回结果集作为第一个输出参数,才能与Hibernate一起使用 。在Oracle 9和更高版本中,这样的存储函数的示例如下:CREATE OR REPLACe FUNCTION selectAllEmployments RETURN SYS_REFCURSORAS st_cursor SYS_REFCURSOR;BEGIN OPEN st_cursor FOR SELECT EMPLOYEE, EMPLOYER, STARTDATE, ENDDATE, REGIONCODE, EID, VALUE, CURRENCY FROM EMPLOYMENT; RETURN st_cursor; END;要在Hibernate中使用此查询,您需要通过命名查询将其映射。
<sql-query name="selectAllEmployees_SP" callable="true"> <return alias="emp" > <return-property name="employee" column="EMPLOYEE"/> <return-property name="employer" column="EMPLOYER"/> <return-property name="startDate" column="STARTDATE"/> <return-property name="endDate" column="ENDDATE"/> <return-property name="regionCode" column="REGIONCODE"/> <return-property name="id" column="EID"/> <return-property name="salary"> <return-column name="VALUE"/> <return-column name="CURRENCY"/> </return-property> </return> { ? = call selectAllEmployments() }</sql-query>当前,存储过程仅返回标量和实体。
<return-join>并且<load-collection>不受支持。16.2.2.1。使用存储过程的规则/限制
除非遵循某些过程/功能规则,否则您不能在Hibernate中使用存储过程。 如果他们不遵守这些规则,则无法在Hibernate中使用。
如果仍然要使用这些过程,则必须通过来执行它们session.connection()。每个数据库的规则都不同,因为数据库供应商具有不同的存储过程语义/语法。存储过程查询不能使用进行分页
setFirstResult()/setMaxResults()。推荐的调用形式为标准SQL92:
{ ? = call functionName(<parameters>) }或{ ? = callprocedureName(<parameters>}。不支持本机调用语法。对于Oracle,适用以下规则:
- 函数必须返回结果集。 过程的第一个参数必须是返回结果集的OUT。这是通过在Oracle
9或10中使用SYS_REFCURSOR类型完成的。在Oracle中,您需要定义REF CURSOR类型。有关更多信息,请参见Oracle文献。…
如我所说,我不确定,但我的理解是您必须
session.getConnection()在这里使用。



