为了在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
,这可能会效率更高,但这不是必需的。
然后需要在任意一个hibernate映射文件中配置一个标签<sql-query>name属性以及result标签,设置result的class属性是你返回的结果集对应的类型,也就是你的实体类,然后call 存储过程名(参数)即可配置完成了
然后获得hibernate的一个session ,调用getnamedquery方法执行你配置好的那个存储过程,然后返回一个list即可对list进行遍历了……
这个问题好象是无解,我之前也遇到过这个问题,在NH2.12里,调用Oracle存贮过程想返回多个值,最后发现只能返回一个值,并且这个值要是游标类型,并且为存贮过程第一个参数。而且这个存贮过程,不能是包中的存贮过程。
给你几个链接:
http://home.cnblogs.com/group/topic/44620.html
http://www.cnblogs.com/1-2-3/archive/2009/11/04/NHibernate-Call-Oracle-Procedure.html
看来好多人都遇到这个问题啊,输出参数真不知道怎么搞,如果谁知道告诉我一声啊,谢谢