Querydsl - 수정, 삭제 벌크 연산
인프런 실전! Querydsl 강의 내용 정리
수정, 삭제 배치 쿼리
쿼리 한번으로 대량 데이터 수정
모든 개발자의 연봉을 50퍼 인상~
이런 행복한 업데이트 할 일이 있다면, 건 by 건 보단 한번에 업데이트 하는 것이 좋을 거다.
예제로 풀어보자.
28살 미만 멤버의 이름을 바꿔 버리겠다.
1
2
3
4
5
6
7
8
9
10
11
@Test
@Commit
public void bulkUpdate() throws Exception {
// member1, 2 나이 < 28 -> 이름 비회원으로 변경
// 3, 4 는 유지
long count = queryFactory
.update(member)
.set(member.username, "비회원")
.where(member.age.lt(28))
.execute();
}
1
2
3
4
5
6
update
member
set
username=?
where
age<?
쿼리가 원하는 것처럼 나갔다.

DB도 바뀌었다.
주의할 게 하나 있다.
벌크연산(수정,삭제) 영속성 컨텍스트를 무시하고 바로 DB를 수정한다.
그래서 혹시나 1차 캐시를 가져와서 쓸 일이 있으면 DB와 캐시가 안 맞을 수 있다.
그래서 걱정되면 em.flush(); em.clear();나 @Modifying 처리 해줘야 한다.
스프링 데이터 JPA - 벌크 쿼리 여길 함 보자.
이번엔 모든 멤버의 나이를 +1 해 보자
1
2
3
4
5
6
@Test
public void bulkAdd() throws Exception {
long count = queryFactory.update(member)
.set(member.age, member.age.add(1))
.execute();
}
update member set age=(age+cast(1 as integer)); 쿼리는 다음과 같이 나왔다.
빼기는 age.add(-n), 곱하기는 age.multiply(n) 로 해주면 된다.
이번엔 삭제를 해보자.
18세 미만 회원 삭제다.
1
2
3
4
5
6
7
@Test
public void bulkDelete() throws Exception {
long count = queryFactory
.delete(member)
.where(member.age.gt(18))
.execute();
}
SQL 삭제 하듯이 하면 된다. 좋다..
댓글남기기