2012-04-23 28 views
0

私はPostgresにストアドプロシージャを持っています。この手順には4つのOUTパラメータがあります。通常JPAを使用すると結果が得られません。私がしようとしているのは、そのプロシージャでSELECTクエリを使用することです。例えばJPAストアドプロシージャを呼び出すHibernate

私はpgAdminでに問い合わせてみた場合:get_results(arg0は、ARG1など)から、

SELECT *を;

4つの列を含む1つの結果行と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

+0

私はcountで同じクエリを試しました。 em.createNativeQuery( "SELECTカウント(*)からget_results(arg0、arg1など)"); q.getSingleResult(); と私は結果として私が期待していた数字 "1"を取得します。それは動作します。しかし、今私は通常のクエリを試して: "[ConnectionManager]トランザクション完了時にバッチャーリソースクリーンアップを強制する; ScrollableResults/Iterato rを閉じるのを忘れましたか?"エラー。 – Panos

答えて

0

以下のコードを使用して、hibernateを使用するコール・プロシージャを使用します。

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

プロシージャの前に4 OUTパラメータがあるので、私はこのコードを使用できません。 JPAは1つのOUTパラメータのみで動作します。だから、唯一の方法は "Select * FROM procedure_name(...)"です。 – Panos

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を参照してください。

関連する問題