JPA и SYS_REFCURSOR как параметр OUT
Я хочу вызвать процедуру с использованием JPA с SYS_REFCURSOR
лайк OUT
параметр. Это очень легко, используя простой 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;
2 ответа
JPA 2.0 не поддерживает хранимые процедуры, но поддержка была добавлена в JPA 2.1, часть Java EE 7. Примеры стандартного кода JPA 2.1 с использованием Oracle SYS_REF_CURSOR:
http://wiki.eclipse.org/EclipseLink/Release/2.5/JPA21
http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics
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 и конфигурацию (не JPA):
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html
(Здесь CURSOR должен быть либо возвращен через "хранимую функцию", либо должен быть первым параметром (out) хранимой процедуры).
Кроме того, в ответе Полпана показано, как это можно сделать с помощью собственного запроса JPA 2.0 с QueryHint, установив свойство проприетарной подсказки Hibernate.
org.hibernate.callable
к истине.
Если вы хотите сделать это с помощью стандартного JPA 2.0, то вам не повезло (кроме взлома через API "нативный запрос"... он стандартизирован в JPA2.1.
DataNucleus JPA поддерживает синтаксис JPA 2.1 с начала 2012 года (как сказано в исходном ответе, поэтому не подразумевается, что означает "текущий ответ устарел"), как показано в этих документах http://www.datanucleus.org/products/accessplatform_3_3/jpa/stored_procedures.html