본문 바로가기
JPA

[JPA] QueryDSL에서 SQL Replace 함수 사용하기

by 그리득 2024. 7. 21.
728x90

QueryDSL을 작성하다 보면 종종 SQL Function을 사용해야 할 상황이 생긴다.

필자도 DB에 저장된 휴대폰번호를 동적쿼리로 조회하기 위해 replace 함수를 사용해야 했는데 이를 알아보고자 글을 작성했다.

 

SELECT *
FROM Employee
WHERE REPLACE(phone, '-', '') LIKE %var%

MySQL에서 replace를 사용한 예시

(이해하기 쉽게 동적 쿼리문을 임의로 작성했습니다)

 

String search = "123"; // 검색할 문자열 (123 부분은 동적으로 들어오는 상황)
QEmployee employee = QEmployee.employee;

// replace 함수를 포함한 StringTemplate 생성
StringTemplate phoneTemplate = Expressions.stringTemplate("replace({0}, '-', '')", employee.phone);

// WHERE 절에 사용할 BooleanExpression 생성
BooleanExpression phoneCondition = phoneTemplate.contains(search);

QueryDSL에선 Expressions.stringTemplate을 통해 replace함수를 사용한 StringTemplate을 가져올 수 있다.

Where절에 추가하기 위해 BooleanExpression으로 변환.

 

List<Employee> results = queryFactory
        .selectFrom(employee)
        .where(phoneCondition)
        .fetch();

BooleanExpression 실제 사용 예시