상세 컨텐츠

본문 제목

[SPRING] Querydsl | 벌크 연산

JAVA/기본 & 강의복습

by ranlan 2021. 5. 17. 02:11

본문

728x90

벌크연산이란

여러 건의 데이터(대량의 데이터)를 한번에 수정, 삭제하는 연산

 

벌크 연산 시 주의해야할 점

현재 영속성 컨텍스트 상태

username age
 member1  10
 member2  20
 member3  30
 member4  40

 

28세 이하 회원의 이름 '비회원'으로 변경

long count = queryFactory
                .update(member)
                .set(member.username, "비회원")
                .where(member.age.lt(28))
                .execute();

 

실행 후 데이터베이스 상태

username age
 member1  10
 member2  20
 비회원  30
 비회원  40

 

영속성 컨텍스트 상태

username age
 member1  10
 member2  20
 member3  30
 member4  40

 

다시 Member를 조회할 경우 DB와 영속성 컨텍스트 사이 차이가 발생한다. 영속성 컨텍스트가 우선권을 가짐으로 수정된 결과가 아닌 영속성 컨텍스트에 올라가 있는 이전의 결과값이 반환되기 때문이다.

따라서 벌크연산 이후 영속성 컨텍스트를 초기화 해줘야 한다.

em.flush();
em.clear();

 

벌크 연산 예시 

예1 ) 덧셈

long count = queryFactory
        .update(member)
        .set(member.age, member.age.add(1))
        .execute();

예2 ) 뺄셈 - 메서드가 따로 없음

long count = queryFactory
        .update(member)
        .set(member.age, member.age.add(-1))
        .execute();

예3 ) 곱셈

long count = queryFactory
        .update(member)
        .set(member.age, member.age.multiply(2))
        .execute();

예4 ) 삭제

long count = queryFactory
        .delete(member)
        .where(member.age.gt(18))
        .execute();

 

728x90

관련글 더보기

댓글 영역