2011-06-24 7 views
2

JPA 2.0/EclipseLink/Glassfish/JEE6を初めて使用しました。基本的な質問があります。JPA 2.0の現在のトランザクションで任意のsqlを実行

ほとんどのエンティティがJPAアノテーションを使用して列に直接マップされているので、EntityManagerを使用してDAOを使用しても問題ありません。

しかし、SQL文を自分で作成しているb/cでは、Oracle固有の関数(空間)を使用しているテーブルがいくつかありますが、SQLのきめ細かな制御が必要です。だから私は文字列の連結でそれを構築しています。すでに進行中のトランザクションがある場合は、現在のトランザクションでSQL実行を登録することができます。

当然私はDriverManagerに直接行き、私自身の接続を作成したくないのですが、私は現在の接続を見つけ、SQLの一部を作成するEntityManager.executeArbitrarySQL(String)関数を探していました。現在の取引。私は私のロッカーをオフですか?

答えて

6

EntityManager.createNativeQuery()メソッドを使用すると、使用しているのと同じEntityManagerのコンテキスト内でネイティブSQLクエリを実行できます。 2つの異なるタイプの2つの があり、提供される引数が異なります。

最初のcreateNativeQuery(String sqlString, Class resultClass)は、クエリによって返される値の型を表すClassオブジェクトを提供する必要があります。これは、永続ユニット内の別のエンティティのクラスにマップできる値のセットを返す場合に使用されます。

第2のcreateNativeQuery(String sqlString, String resultSetMapping)は、結果セットマッピングの名前を指定する必要があります。結果セットのマッピングは、@SqlResultSetMapping注釈を使用して定義する必要があります。

最後のcreateNativeQuery(String sqlString)は、結果セットが返されないシナリオ、つまりINSERT、UPDATE、およびDELETEステートメントの実行で使用されることが明らかです。

また、注釈またはファイルのnamed-native-query要素を使用してネイティブクエリーを定義することもできますが、開発中のクエリの構造を知っているシナリオに適しています。ただし、実行するSQL文のすべての品種を表すネイティブ・ネーブリーを複数作成し、ユーザー入力に基づいて実行時に異なるものを実行することもできます。注釈付きネイティブクエリは、EntityManager.createNamedQuery()メソッドを使用して実行されます。実行時にネイティブクエリに値を提供するために、位置パラメータ(?プレースホルダを使用して定義)を使用する必要があります。

関連する問題