16.2.2.1. 使用存储过程的规则和限制
为了在Hibernate中使用存储过程,你必须遵循一些规则.不遵循这些规则的存储过程将不可用.如果你仍然想要使用他们, 你必须通过session.connection()
来执行他们.这些规则针对于不同的数据库.因为数据库 提供商有各种不同的存储过程语法和语义.
对存储过程进行的查询无法使用setFirstResult()/setMaxResults()
进行分页。
建议采用的调用方式是标准SQL92: { ? = call functionName(<parameters>) }
或者 { ? = call procedureName(<parameters>}
.原生调用语法不被支持。
对于Oracle有如下规则:
- 函数必须返回一个结果集。存储过程的第一个参数必须是
OUT
,它返回一个结果集。这是通过Oracle 9或10的SYS_REFCURSOR
类型来完成的。在Oracle中你需要定义一个REF CURSOR
类型,参见Oracle的手册。
对于Sybase或者MS SQL server有如下规则:
存储过程必须返回一个结果集。.注意这些servers可能返回多个结果集以及更新的数目.Hibernate将取出第一条结果集作为它的返回值, 其他将被丢弃。
如果你能够在存储过程里设定
SET NOCOUNT ON
,这可能会效率更高,但这不是必需的。