2012-04-23 84 views
0

我在Postgres中有一個存儲過程。該過程具有4個OUT參數。通常使用JPA我無法得到結果。我想要做的是用該過程使用SELECT查詢。JPA Hibernate調用存儲過程

例如,如果我在pgAdmin的嘗試查詢:

SELECT * FROM get_results(爲arg0,ARG1等);

我得到一個結果行,其中包含4列,結果來自4個OUT參數。

但是當我嘗試在JPA中使用它時失敗。我想是這樣的:

Query q = em.createNativeQuery("SELECT * FROM get_results (arg0, arg1 etc)"); 
q.getSingleResult(); 

但它拋出一個java.lang.IllegalStateException [com.arjuna.ats.internal.jta.transaction.arjunacore.nosuchtx] [com.arjuna.ats.internal.jta.transaction.arjunacore.nosuchtx] No such transaction!

有什麼建議?

+0

錯誤消息指向事務問題。其他原生查詢(如從表中選擇)在那個地方工作嗎? – mrab 2012-04-23 07:26:23

+0

我用count來嘗試相同的查詢。 em.createNativeQuery(「SELECT count(*)FROM get_results(arg0,arg1 etc)」); q.getSingleResult(); 我得到了數字「1」,這是我期待的結果。所以它工作。但現在當我嘗試正常的查詢時,我得到: 「[ConnectionManager]強制事務完成時批處理器資源清理;忘記關閉ScrollableResults/Iterato r?」錯誤。 – Panos 2012-04-23 07:40:03

回答

0

使用下面的代碼共同呼叫使用休眠程序。

Query query = session.getNamedQuery("ProcedureName") 
    .setParameter(parameterName,value); 
    .setParameter(parameterName,value); 
    .setParameter(parameterName,value); 
    .setParameter(parameterName,value); 
+0

我無法使用此代碼,因爲正如我之前所說的,我的過程有4個OUT參數。 JPA僅使用1個OUT參數。所以唯一的辦法是「選擇*從procedure_name(...)」。 – Panos 2012-04-23 08:02:27

2

JPA 2.1現在支持存儲過程,請閱讀Java文檔here

實施例:

StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("sales_tax"); 
// set parameters 
storedProcedure.registerStoredProcedureParameter("subtotal", Double.class, ParameterMode.IN); 
storedProcedure.registerStoredProcedureParameter("tax", Double.class, ParameterMode.OUT); 
storedProcedure.setParameter("subtotal", 1f); 
// execute SP 
storedProcedure.execute(); 
// get result 
Double tax = (Double)storedProcedure.getOutputParameterValue("tax"); 

參見詳細的例子here