2014-11-25 59 views
1

我試圖調用Oracle存儲過程如何使用JPA 2

create or replace 
    procedure save_item (
          item_arr__p in  complex_list__t, 
          status__p   out varchar2, 
          status_message__p out varchar2) is 
... 
begin 
... 
end 

而且complex_list__t類型被定義這樣通過複雜的對象爲IN參數的陣列中的存儲過程:

create or replace 
type complex_list__t is table of simple_list__t 

而且simple_list__t類型定義是這樣的:

create or replace 
type simple_list__t is table of varchar2(2000) 

我想用調用此方法JPA 2.我不確定JPA支持數組作爲參數。 我希望能夠做到這一點:

StoredProcedureQuery query = em.createNamedStoredProcedureQuery("pkg_api_wd_item.save_item"); 
query.registerStoredProcedureParameter("item_arr__p", MyComplexObject[].class, ParameterMode.IN); 
query.registerStoredProcedureParameter("status__p", String.class, ParameterMode.OUT); 
query.registerStoredProcedureParameter("status_message__p", String.class, ParameterMode.OUT); 

query.setParameter("item_arr__p", myobjects); 
query.execute(); 

String status = (String) query.getOutputParameterValue("status__p"); 
String message = (String) query.getOutputParameterValue("status_message__p"); 

我真的想使用JPA,因爲我想我的應用程序是不可知(無甲骨文依賴)。

如果它不被JPA支持,我可以使用CLOB參數而不是我的數組嗎?

回答

0

您可以嘗試通過一個

List<MyComplexObject> 

,而不是他們的陣列。如果不行,你可以試試

List<List<String>> 

而不是兩者之一。

+0

問題是,我無法找到一種方法在存儲過程的參數中完全傳遞數組。最後的代碼塊是我希望它會工作的方式。哪些是傳遞這些項目的數組,但是這不起作用,據我所知。 – hishamaus 2014-11-25 04:55:33

+0

這就是爲什麼我建議你傳遞一個List而不是一個數組。 – 2014-11-25 04:58:14

+0

我試過了,但是我得到一個異常:type不能爲null。堆棧跟蹤完成: java.lang.IllegalArgumentException:類型不能爲空 AbstractParameterRegistrationImpl.setHibernateType(AbstractParameterRegistrationImpl.java:182) AbstractParameterRegistrationImpl。 <init>(AbstractParameterRegistrationImpl.java:131) AbstractParameterRegistrationImpl。 <init>(AbstractParameterRegistrationImpl.java:140) – hishamaus 2014-11-25 23:17:38