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:

    http://www.hibernate.org/downloads

  • 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

Другие вопросы по тегам