Stored Procedures

Dev.Hammy·2024년 4월 21일
0

Spring Data JPA

목록 보기
9/13
post-custom-banner

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으로 반환될 수 있습니다.

post-custom-banner

0개의 댓글