1 분 소요

인프런 실전! 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 삭제 하듯이 하면 된다. 좋다..

태그: ,

카테고리:

업데이트:

댓글남기기