最新の安定バージョンについては、Spring Data JPA 3.5.4 を使用してください! |
ストアドプロシージャー
JPA 2.1 仕様では、JPA 条件クエリ API を使用してストアドプロシージャを呼び出すサポートが導入されました。リポジトリメソッドでストアドプロシージャメタデータを宣言するための @Procedure
アノテーションを導入しました。
以下の例では、次のストアドプロシージャを使用します。
plus1inout
プロシージャの定義。/;
DROP procedure IF EXISTS plus1inout
/;
CREATE procedure plus1inout (IN arg int, OUT res int)
BEGIN ATOMIC
set res = arg + 1;
END
/;
ストアドプロシージャのメタデータは、エンティティ型で NamedStoredProcedureQuery
アノテーションを使用して構成できます。
@Entity
@NamedStoredProcedureQuery(name = "User.plus1", procedureName = "plus1inout", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) })
public class User {}
@NamedStoredProcedureQuery
には、ストアドプロシージャの 2 つの異なる名前があることに注意してください。name
は、JPA が使用する名前です。procedureName
は、データベース内のストアドプロシージャの名前です。
リポジトリメソッドからストアドプロシージャを複数の方法で参照できます。呼び出されるストアードプロシージャーは、@Procedure
アノテーションの value
または procedureName
属性を使用して直接定義できます。これは、データベース内のストアドプロシージャを直接参照し、@NamedStoredProcedureQuery
を介した構成を無視します。
または、@NamedStoredProcedureQuery.name
属性を @Procedure.name
属性として指定できます。value
、procedureName
、name
のいずれも構成されていない場合、リポジトリ方式の名前が name
属性として使用されます。
次の例は、明示的にマップされたプロシージャを参照する方法を示しています。
@Procedure("plus1inout")
Integer explicitlyNamedPlus1inout(Integer arg);
次の例は前の例と同等ですが、procedureName
エイリアスを使用しています。
procedureName
エイリアスを介してデータベース内の名前 "plus1inout" を持つ暗黙的にマップされたプロシージャを参照します。@Procedure(procedureName = "plus1inout")
Integer callPlus1InOut(Integer arg);
以下は、明示的なアノテーション属性の代わりにメソッド名を使用している点を除いて、前の 2 つと同じです。
EntityManager
で暗黙的にマップされた名前付きストアドプロシージャ "User.plus1" を参照します。@Procedure
Integer plus1inout(@Param("arg") Integer arg);
次の例は、@NamedStoredProcedureQuery.name
属性を参照してストアドプロシージャを参照する方法を示しています。
EntityManager
で明示的にマップされた名前付きストアドプロシージャ "User.plus1IO" の参照。@Procedure(name = "User.plus1IO")
Integer entityAnnotatedCustomNamedProcedurePlus1IO(@Param("arg") Integer arg);
呼び出されるストアドプロシージャに単一の出力パラメーターがある場合、そのパラメーターはメソッドの戻り値として返されます。@NamedStoredProcedureQuery
アノテーションで複数の出力パラメーターが指定されている場合、@NamedStoredProcedureQuery
アノテーションで指定されたパラメーター名をキーとして Map
として返すことができます。
ストアドプロシージャが ResultSet を返す場合、メソッドが Map 戻り値の型を宣言しない限り、Java は単一のメソッド戻り値しか返せないため、OUT パラメーターは省略されることに注意してください。 |
次の例は、ストアドプロシージャに複数の OUT
パラメーターがあり、@NamedStoredProcedureQuery
として登録されている場合に、複数の OUT
パラメーターを取得する方法を示しています。パラメーターメタデータを提供するには、@NamedStoredProcedureQuery
の登録が必要です。
@Entity
@NamedStoredProcedureQuery(name = "User.multiple_out_parameters", procedureName = "multiple_out_parameters", parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
@StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, name = "some_cursor", type = void.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) })
public class User {}
@Procedure(name = "User.multiple_out_parameters")
Map<String, Object> returnsMultipleOutParameters(@Param("arg") Integer arg);