반응형
스토어드 프로시저 사용
JPA는 2.1부터 스토어드 프로시저를 지원한다.
단순히 입력 값을 두 배로 증가시켜 주는 proc_multiply라는 스토어드 프로시저가 있다.
이 프로시저는 첫 번째 파라미터로 값을 입력받고 두 번째 파라미터로 결과를 반환한다.
DELIMITER //
CREATE PROCEDURE proc_multiply (INOUT inParam INT, INOUT outParam IN)
BEGIN
SET outParam * 2;
END //
JPA로 스토어드 프로시저를 호출해보자.
StoredProcedureQuery spq = e.createStoredProcedureQuery("proc_multiply");
// 파라미터 순서 사용
spq.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN);
// 파라미터 이름 사용
// spq.registerStoredProcedureParameter("inParam", Integer.class, ParameterMode.IN);
// 파라미터 순서 사용
spq.registerStoredProcedureParameter(2, Integer.class, ParameterMode.OUT);
// 파라미터 이름 사용
// spq.registerStoredProcedureParameter("outParam", Integer.class, ParameterMode.OUT);
spq.setParameter(1, 100);
spq.execute();
Integer out = (Integer)spq.getOutputParameterValue(2);
System.out.println("out = " + out); // 결과 = 200
스토어드 프로시저를 사용하려면 em.createStoredProcedureQuery() 메소드에 사용할 스토어드 프로시저 이름을 입력하면 된다. 그리고 registerStoredProcedureParameter() 메소드를 사용해서 프로시저에 사용할 파라미터를 순서, 타입, 파라미터 모드 순으로 정의하면 된다.
파라미터 순서대신 이름을 지정하여 사용할 수 도있다.
ParameterMode는 IN, INOUT, OUT, REF_CURSOR 이렇게 네 가지를 사용할 수 있다.
public enum ParameterMode {
IN, // INPUT 파라미터
INOUT, // INPUT, OUTPUT 파라미터
OUT, // OUTPUT 파라미터
REF_CURSOR // // CURSOR 파라미터
}
Named 스토어드 프로시저 사용
스토어드 프로시저 쿼리에 이름을 부여해서 사용하는 것을 Named 스토어드 프로시저라 한다.
@NamedStoredProcedureQuery(
name = "multiply",
procedureName = "proc_multiply",
parameters = {
@StoredProcedureParameter(name = "inParam", mode = ParameterMode.IN, type = Integer.class),
@StoredProcedureParameter(name = "outParam", mode = ParameterMode.OUT, type = Integer.class)
}
)
@Entity
public class Member { ... }
@NamedStoredProcedureQuery로 정의하고 name 속성으로 이름을 부여하면 된다.
procedureName 속성에 실제 호출할 프로시저 이름을 적어주고 @StoredProcedureParameter를 사용해서 파라미터 정보를 정의하면 된다.
둘 이상을 정의하려면 @NamedStoredProcedureQueries를 사용하면 된다.
메소드에 등록한 Named 스토어드 프로시저 이름을 파라미터로 사용해서 찾아올 수 있다.
StoredProcedureQuery spq = em.createNamedStoredProcedureQuery("multiply");
spq.setParameter("inParam", 100);
spq.execute();
Integer out = (Integer) spq.getOutputParameterValue("outParam");
반응형
'JPA' 카테고리의 다른 글
Spring Data JPA 소개 (0) | 2022.01.18 |
---|---|
벌크 연산, JPQL과 영속성 콘텍스트, Flush Mode (1) | 2022.01.17 |
JPA N+1 문제 해결하기 (0) | 2022.01.17 |
자주 사용하는 JPQL 문법 정리 (0) | 2022.01.14 |
JPQL 경로 표현식 (0) | 2022.01.14 |