JPA 2.1 사양에는 JPA 기준 쿼리 API를 사용하여 저장 프로시저 호출에 대한 지원이 도입되었습니다. 리포지토리 메서드에서 저장 프로시저 메타데이터를 선언하기 위한 @Procedure
annotation을 도입했습니다.
다음 예제에서는 다음 저장 프로시저를 사용합니다.
Example 1. The definition of the plus1inout procedure in HSQL DB.
/;
DROP procedure IF EXISTS plus1inout
/;
CREATE procedure plus1inout (IN arg int, OUT res int)
BEGIN ATOMIC
set res = arg + 1;
END
/;
저장 프로시저의 메타데이터는 엔터티 유형에 대한 NamedStoredProcedureQuery
annotation을 사용하여 구성할 수 있습니다.
Example 2. StoredProcedure metadata definitions on an entity.
@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
에는 저장 프로시저에 대한 두 가지 다른 이름이 있습니다. name
은 JPA가 사용하는 이름입니다. procedureName
은 데이터베이스에 있는 저장 프로시저의 이름입니다.
다양한 방법으로 리포지토리 메서드에서 저장 프로시저를 참조할 수 있습니다. 호출할 저장 프로시저는 @Procedure
annotation의 value
또는 procedureName
속성을 사용하여 직접 정의할 수 있습니다. 이는 데이터베이스의 저장 프로시저를 직접 참조하고 @NamedStoredProcedureQuery
를 통한 모든 구성을 무시합니다.
또는 @NamedStoredProcedureQuery.name
속성을 @Procedure.name
속성으로 지정할 수도 있습니다. value
, procedureName
, name
이 모두 구성되지 않은 경우 리포지토리 메서드의 이름이 name
속성으로 사용됩니다.
다음 예에서는 명시적으로 매핑된 프로시저를 참조하는 방법을 보여줍니다.
Example 3. Referencing explicitly mapped procedure with name "plus1inout" in database.
@Procedure("plus1inout")
Integer explicitlyNamedPlus1inout(Integer arg);
다음 예제는 이전 예제와 동일하지만 procedureName
별칭을 사용합니다.
Example 4. Referencing implicitly mapped procedure with name "plus1inout" in database via procedureName alias.
@Procedure(procedureName = "plus1inout")
Integer callPlus1InOut(Integer arg);
다음은 이전 두 개와 동일하지만 명시적인 annotation 속성 대신 메서드 이름을 사용합니다.
Example 5. Referencing implicitly mapped named stored procedure "User.plus1" in EntityManager by using the method name.
@Procedure
Integer plus1inout(@Param("arg") Integer arg);
다음 예에서는 @NamedStoredProcedureQuery.name
특성을 참조하여 저장 프로시저를 참조하는 방법을 보여줍니다.
Example 6. Referencing explicitly mapped named stored procedure "User.plus1IO" in EntityManager.
@Procedure(name = "User.plus1IO")
Integer entityAnnotatedCustomNamedProcedurePlus1IO(@Param("arg") Integer arg);
호출되는 저장 프로시저에 단일 출력 매개변수가 있는 경우 해당 매개변수가 메소드의 반환 값으로 반환될 수 있습니다. @NamedStoredProcedureQuery
annotation에 지정된 여러 출력 매개변수가 있는 경우 해당 매개변수는 @NamedStoredProcedureQuery
annotation에 지정된 매개변수 이름이 되는 키를 사용하여 Map
으로 반환될 수 있습니다.