我正在使用舊版Oracle數據庫,其中所有存儲過程都使用OUT參數,最後定義。 Hibernate僅支持存儲過程,其中OUT參數定義爲,首先是。Hibernate JPA 2.1:OUT REF CURSOR在第一位以外的位置?
使用Hibernate ORM 4.3.5,有沒有辦法覆蓋Hibernate的Oracle驅動程序使用最後參數代替第一用於獲取從@NamedNativeQuery
價值?我已經開始使用CallableStatement
的路徑,但是這打破了使用Hibernate和JPA的全部目的。
下面是我已經嘗試定義我@NamedNativeQuery
,我想用這個定義,如果能夠堅持:
@NamedNativeQuery(
name = "MyEntity.storedProc",
query = "call ENTITY_PKG.StoredProc(:inputOne, :inputTwo, :resultSet)",
callable = true,
readOnly = true,
resultClass = MyEntity.class
)
更新:
上跟進後尼爾斯托克頓的回答,我想出了以下@NamedStoredProcedureQuery
註釋:
@NamedStoredProcedureQuery(
name = "MyEntity.storedProc",
procedureName = "ENTITY_PKG.StoredProc",
resultClasses = MyEntity.class,
parameters = {
@StoredProcedureParameter(name = "I_INPUT_ONE", type = String.class, mode = ParameterMode.IN),
@StoredProcedureParameter(name = "I_INPUT_TWO", type = Character.class, mode = ParameterMode.IN),
@StoredProcedureParameter(name = "O_CURSOR", type = void.class, mode = ParameterMode.REF_CURSOR)
}
)
但是,在這個例外中使用上述結果... java.lang.UnsupportedOperationException: org.hibernate.dialect.Oracle10gDialect does not support resultsets via stored procedures
。這裏的堆棧跟蹤:
Caused by: java.lang.UnsupportedOperationException: org.hibernate.dialect.Oracle10gDialect does not support resultsets via stored procedures
at org.hibernate.dialect.Dialect.registerResultSetOutParameter(Dialect.java:1612)
at org.hibernate.engine.jdbc.cursor.internal.StandardRefCursorSupport.registerRefCursorParameter(StandardRefCursorSupport.java:94)
at org.hibernate.procedure.internal.AbstractParameterRegistrationImpl.prepare(AbstractParameterRegistrationImpl.java:298)
at org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs(ProcedureCallImpl.java:417)
at org.hibernate.procedure.internal.ProcedureCallImpl.getOutputs(ProcedureCallImpl.java:378)
at org.hibernate.jpa.internal.StoredProcedureQueryImpl.outputs(StoredProcedureQueryImpl.java:251)
at org.hibernate.jpa.internal.StoredProcedureQueryImpl.execute(StoredProcedureQueryImpl.java:234)
at com.example.MyEntityDao.testStoredProc(MyEntityDao.java:88)
這時候,我嘗試執行這樣的查詢時:
StoredProcedureQuery query = entityManager
.createNamedStoredProcedureQuery("MyEntity.storedProc");
query.setParameter("I_INPUT_ONE", "inputOneValue");
query.setParameter("I_INPUT_TWO", 'x');
query.execute(); // exception is triggered by query.execute()
MyEntity myEntity = (MyEntity) query.getOutputParameterValue("O_CURSOR");
這沒有一大堆的本身意義,因爲Oracle10gDialect
確實繼承執行registerResultSetOutParameter()
。這種方法是@Override
nby,它是Oracle9iDialect
的超類,其又是Oracle10gDialect
的超類。
我的Hibernate方言中的persistence.xml
的<properties>
部分定義:
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
供參考,這是我的存儲過程的規範......身體已經沒有RETURN
,所以OUT
光標是唯一我有訪問結果的方式。
CREATE OR REPLACE PACKAGE ENTITY_PKG IS
TYPE EntityCursor IS REF CURSOR;
PROCEDURE StoredProc
(
I_INPUT_ONE IN ENTITIES.INPUT_ONE%TYPE, -- VARCHAR2
I_INPUT_TWO IN ENTITIES.INPUT_TWO%TYPE, -- CHAR
O_CURSOR OUT EntityCursor
);
END ENTITY_PKG;
我在做什麼錯?
Oracle不直接支持返回ResultSet的存儲過程,但有一種解決方法。參考[這裏](http://blog.harpoontech.com/2013/05/using-oracle-stored-procedures-and-java.html)。 HTH – Osy