如何通过hibernate访问pl / sql proc中的out参数

我有一个带有以下签名的pl / sql过程

PROCEDURE pr_log_process_started ( p_process_id IN log_process_status.process_id%TYPE, p_run_id IN OUT log_process_status.run_id%TYPE); 

如何通过Hibernate调用此proc并在调用后访问第二个参数的值?

如何通过Hibernate调用此proc并在调用后访问第二个参数的值?

我认为你不能。 至少,这不是我对第16章的理解。官方文档的原生SQL :

16.2.2。 使用存储过程进行查询

Hibernate3通过存储过程和函数为查询提供支持。 以下大多数文档都是等效的。 存储过程/函数必须返回一个结果集作为第一个能够使用Hibernate的out参数。 Oracle 9及更高版本中此类存储函数的示例如下:

 CREATE OR REPLACE FUNCTION selectAllEmployments RETURN SYS_REFCURSOR AS 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中使用此查询,您需要通过命名查询映射它。

              { ? = call selectAllEmployments() }  

存储过程目前仅返回标量和实体。 不支持

16.2.2.1。 使用存储过程的规则/限制

除非遵循某些过程/函数规则,否则不能将存储过程与Hibernate一起使用。 如果他们不遵守这些规则,他们就无法使用Hibernate。 如果您仍想使用这些过程,则必须通过session.connection()执行它们。 每个数据库的规则都不同,因为数据库供应商具有不同的存储过程语义/语法。

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

推荐的呼叫表格是标准的SQL92: { ? = call functionName() } { ? = call functionName() }{ ? = call procedureName(} { ? = call procedureName(} 。不支持本机调用语法。

对于Oracle,以下规则适用:

  • 函数必须返回结果集。 过程的第一个参数必须是返回结果集的OUT。 这是通过在Oracle 9或10中使用SYS_REFCURSOR类型来完成的。在Oracle中,您需要定义REF CURSOR类型。 有关详细信息,请参阅Oracle文献。

对于Sybase或MS SQL Server,以下规则适用:

  • 该过程必须返回结果集。 请注意,由于这些服务器可以返回多个结果集和更新计数,因此Hibernate将迭代结果并将结果集的第一个结果作为其返回值。 其他一切都将被丢弃。

  • 如果您可以在您的过程中启用SET NOCOUNT ON,那么它可能会更有效,但这不是必需的。

总而言之,要么遵循规则,要么通过session.connection()使用原始JDBC。