본문 바로가기
Java & Kotlin/Spring Data

[QueryDSL] 벌크연산과 SQL Funtion

by heekng 2022. 5. 15.
반응형

벌크연산과 SQL Function

쿼리를 이용하면 일정한 조건에 해당하는 데이터에 공통적으로 수정해야 하는 일이 있다.
이 때 벌크 연산을 이용한다.

벌크연산

long count = queryFactory
    .update(member)
    .set(member.username, "비회원")
    .where(member.age.lt(28))
    .execute();
  • member의 age가 28 이하인 경우 username를 비회원으로 수정하는 벌크연산이다.
  • query와 동일하게 update, delete등을 이용한다.
  • 벌크연산의 주의할 점은 spring data jpa와 다르게 영속성 컨텍스트에 있는 엔티티를 무시하고 데이터베이스에 직접 실행된다.
    그렇기 때문에 배치 쿼리를 실행하고 나면 영속성 컨텍스트를 초기화 하는 것이 안전하다.

SQL Function

List<String> result = queryFactory
    .select(
            Expressions.stringTemplate("function('replace', {0}, {1}, {2})", member.username, "member", "m")
    )
    .from(member)
    .fetch();
  • Expressions.stringTemplate(...)의 형식으로 함수 호출이 가능하다.
  • SQl function은 JPA처럼 Dialect에 등록된 내용만 호출할 수 있다.
  • org.hibernate.dialect 패키지의 각 Database별 Dialect를 통해 사용 가능한 function을 확인할 수 있다.
    • 사용자 정의 함수의 경우 dialect를 상속받아 새로 정의하며 사용 가능하다.
  • 꼭 함수를 사용하는 것이 아닌 member.username.lower()과 같이 ansi 표준 함수들은 querydsl이 내장하고 있기 때문에 이를 사용하는 것도 좋은 방법이다.
반응형