• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

오라클 함수

23.04.13 15:42 작성 23.04.13 16:05 수정 조회수 212

0

안녕하세요 영한님 강의 너무 잘 들었습니다.

저희 팀에서 스프링 데이터 jpa, querydsl을 사용해서 프로젝트를 할 예정입니다.

db는 오라클을 사용할 건데요

jpa나 querydsl에서 오라클 함수나 프로시저등을 사용 할 수 있는 방법이 있을까요?

jpa, querydsl을 제가 해야 될 것 같아서 조금 긴장되네요

답변부탁드립니다.

찾아보니 가능한것 같습니다~

답변 1

답변을 작성해보세요.

2

codesweaver님의 프로필

codesweaver

2023.04.13

안녕하세요, ko 님! 공식 서포터즈 codesweaver 입니다.

@NamedStoredProcedureQuery 를 활용하여 프로시저를 사용하실 수 있습니다. 다음과 같은 방법을 사용합니다.

// oracle
CREATE OR REPLACE PROCEDURE add_employee (
  p_first_name IN VARCHAR2,
  p_last_name IN VARCHAR2,
  p_email IN VARCHAR2
)
AS
BEGIN
  INSERT INTO employees (first_name, last_name, email)
  VALUES (p_first_name, p_last_name, p_email);
  COMMIT;
END;

// java
@NamedStoredProcedureQuery(
  name = "addEmployee",
  procedureName = "add_employee",
  parameters = {
    @StoredProcedureParameter(mode = ParameterMode.IN, name = "p_first_name", type = String.class),
    @StoredProcedureParameter(mode = ParameterMode.IN, name = "p_last_name", type = String.class),
    @StoredProcedureParameter(mode = ParameterMode.IN, name = "p_email", type = String.class)
  }
)

// 
StoredProcedureQuery storedProcedure = entityManager.createNamedStoredProcedureQuery("addEmployee");
storedProcedure.setParameter("p_first_name", "John");
storedProcedure.setParameter("p_last_name", "Doe");
storedProcedure.setParameter("p_email", "john.doe@example.com");
storedProcedure.execute();

 

QueryDSL 에서는 다음과이 nativeQuery 로 프로시져를 사용합니다.

// oracle 
CREATE OR REPLACE PROCEDURE get_employee (
  p_id IN NUMBER,
  o_first_name OUT VARCHAR2,
  o_last_name OUT VARCHAR2,
  o_email OUT VARCHAR2
)
AS
BEGIN
  SELECT first_name, last_name, email
  INTO o_first_name, o_last_name, o_email
  FROM employees
  WHERE id = p_id;
END;

// java
QEmployee employee = QEmployee.employee;
NumberPath<Long> idPath = employee.id;

StringPath firstNamePath = Expressions.stringPath("o_first_name");
StringPath lastNamePath = Expressions.stringPath("o_last_name");
StringPath emailPath = Expressions.stringPath("o_email");

JPAQuery<?> query = new JPAQuery<>(entityManager);
query.nativeQuery("CALL get_employee(:id, :o_first_name, :o_last_name, :o_email)")
  .setParameter("id", 1)
  .setParameter(firstNamePath, "")
  .setParameter(lastNamePath, "")
  .setParameter(emailPath, "");

String firstName = query.fetchOne().get(firstNamePath);
String lastName = query.fetchOne().get(lastNamePath);
String email = query.fetchOne().

 

감사합니다.

ko님의 프로필

ko

질문자

2023.04.13

답변감사합니다 ~~

그럼 properties 파일에서 spring.jpa.database-platform은 오라클 방언으로 설정하면 되나요?