2014-04-15 68 views
2

我正在使用舊版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()。這種方法是@Overridenby,它是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; 

我在做什麼錯?

+1

Oracle不直接支持返回ResultSet的存儲過程,但有一種解決方法。參考[這裏](http://blog.harpoontech.com/2013/05/using-oracle-stored-procedures-and-java.html)。 HTH – Osy

回答

1

JPA 2.1提供了一個使用存儲過程的API,而不是像原生的「查詢」那樣將它們作爲黑客入侵。也許你真的應該使用它?

+0

使用JPA 2.1,Hibernate 5.0.9,Oracle10gDialect - 我不能讓存儲過程API使用命名參數和至少一個OUT參數。定位似乎沒問題,但只是在那裏發出警告。 – demaniak

+0

也許你應該添加你自己的問題與你的問題的細節,因爲這是針對別人的 –

+0

我用StoredProcedureQuery嘗試但得到相同的異常,所以問題是不使用JPA 2.1 – fjkjava