我想使用带有SYS_REFCURSOR
OUT
参数的JPA来调用一个过程。使用普通JDBC非常容易,但我不确定在JPA中是否可行。
我的程序如下:
CREATE OR REPLACE FUNCTION FN_GET_COINS
RETURN SYS_REFCURSOR
IS vCursor SYS_REFCURSOR;
BEGIN
OPEN vCursor FOR
SELECT
...
RETURN vCursor;
CLOSE vCursor;
EXCEPTION
...
END FN_GET_COINS;
答案 0 :(得分:5)
JPA 2.0 不支持存储过程,但 JPA 2.1 ( Java EE 7 的一部分)中添加了支持。使用Oracle SYS_REF_CURSOR的标准JPA 2.1代码示例:
http://wiki.eclipse.org/EclipseLink/Release/2.5/JPA21#Ref_cursor_Example
http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#JPA_2.1_StoredProcedureQuery
EclipseLink 2.5支持JPA 2.1(它是参考实现):
http://www.eclipse.org/eclipselink/releases/2.5.php
https://glassfish.java.net/
Hibernate 4.3.11支持JPA 2.1:
Hibernate高达4.2支持通过本机API和&存储过程。 config(非JPA):
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query
(这里CURSOR必须通过'存储函数'返回,或者必须是存储过程的第一个参数(out))。
此外,Polpan的回答here显示如何使用带有QueryHint的JPA 2.0本机查询来完成此操作,将Hibernate专有提示属性org.hibernate.callable
设置为true。
答案 1 :(得分:0)
如果你想使用标准化的JPA 2.0来做这件事,那么你就不走运了(除了通过“原生查询”API进行黑客攻击之外......它在JPA2.1中已经标准化。
自2012年初以来,DataNucleus JPA一直支持JPA 2.1语法(如原始答案所述,所以不知道“当前答案是否过时”应该是什么意思),如这些文档中所示 http://www.datanucleus.org/products/accessplatform_3_3/jpa/stored_procedures.html