반응형
- 스토어드 프로시저는 JPA 2.1부터 지원되며, 아래와 같이 DB에 저장되어 있는 프로시저를 JPA에서 사용할 수 있다.
# inParam 값에 3을 곱해서 반환하는 프로시저
CREATE OR REPLACE RPOCEDURE proc_multiply(IN inParam INT, OUT outParam INT)
BEGIN
SET outParam = inParam * 3;
END
- JPA에서 제공하는 ParameterMode는 다음과 같다.
- ParameterMode.IN : INPUT 파라미터
- ParameterMode.OUT : OUTPUT 파라미터
- ParameterMode.INOUT : INPUT, OUTPUT 파라미터
- ParameterMode.REF_CURSOR : CURSOR 파라미터
1. 스토어드 프로시저 사용
- EntityManager의 createStoredProcedureQuery() 메소드를 사용한다.
- 파라미터를 순서 기반이나 이름 기반으로 선택하여 사용할 수 있다.
StoredProcedureQuery spq = em.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.setParameter("inParam", 100) // 이름 기반
sql.execute();
Integer output = (Integer) spq.getOutputParameterValue(2); // 순서 기반
// Integer output = (Integer) spq.getOutputParameterValue("outParam"); // 이름 기반
2. Named 스토어드 프로시저 사용
1) 어노테이션에 정의하기
- 스토어드 프로시저 쿼리에 이름을 부여해서 사용할 수 있다.
- 적당한 엔티티 클래스에 @NamedStoredProcedureQuery를 정의해서 사용하면 된다.
- parameters 속성에 파라미터 정보를 모두 정의해주면 된다.
@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 {...}
2) XML에 정의하기
- 방금 살펴본 어노테이션 방식 예제와 적용 내용은 동일하다.
- 직관적으로 알 수 있으므로 설명은 생략한다.
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="htt://xmlns.jcp.org/xml/ns/persistence/orm" version="2.1">
<named-stored-procedure-query name="multiply" procedure-name="proc_multiply">
<parameter name="inParam" mode="IN" class="java.lang.Integer" />
<parameter name="outParam" mode="OUT" class="java.lang.Integer" />
</named-stored-procedure-query>
</entity-mappings>
3) Named 스토어드 프로시저 사용
- Named 스토어드 프로시저를 사용할 때는 createNamedStoredProcedureQuery() 메소드의 파라미터에 Named 스토어드 프로시저의 이름만 명시해주면 StoredProcedureQuery 객체를 생성할 수 있다.
StoredProcedureQuery spq = em.createNamedStoredProcedureQuery("multiply");
// ...
● 참고자료 : 자바 ORM 표준 JPA 프로그래밍
반응형
'Spring 사전 준비 > JPA Hibernate' 카테고리의 다른 글
[JPA] Spring Data JPA(1) (0) | 2022.08.19 |
---|---|
[JPA] JPQL 최적화 (0) | 2022.08.14 |
[JPA] 네이티브 SQL (0) | 2022.08.11 |
[JPA] QueryDSL (0) | 2022.08.10 |
[JPA] JPQL의 작성 (0) | 2022.08.04 |
댓글