[Querydsl] 수정, 삭제 벌크 연산

Welcome to Seoyun Dev Log·2023년 4월 28일
0

JPA

목록 보기
8/15

벌크 연산

쿼리 한번으로 대량의 데이터를 수정할 때 사용

변경 감지가 일어나면서 update 쿼리가 나가는 것
개별 엔티티 건건이 나가는 것

  • 벌크 연산 처리
    : 벌크 연산이 나가면 이미 DB와 영속성 컨텍스트가 일치하지 않는다
    : 벌크 연산을 하고 데이터를 변경했지만 영속성 컨텍스트가 우선권을 가지고 있기 때문에 1차 캐시는 무시된다
    데이터에는 값이 수정되어 반영되어있음에도 불구하고 애플리케이션에서 조회를 하면 변경하기 전의 값이 반환된다.
    이를 해결하기 위한 방법으로는
    em.flush -> 영속성 컨텍스트에 있는 값을 DB와 맞추고
    em.clear -> 영속성 컨텍스트에 있는 것을 초기화
    를 해줘서 캐시를 비워줘야한다

1) update

@Commit
    @DisplayName("bulkUpdate")
    @Test
    void bulkUpdate() {
        //벌크 연산 전 DB
        //member1 -> member1
        //member2 -> member2
        //member3 -> member3
        //member4 -> member4
        long count = jpaQueryFactory
                .update(member)
                .set(member.username, "비회원")
                .where(member.age.lt(28))
                .execute();
                
		em.flush();
        em.clear();
        
        //벌크 연산 후 DB
        //member1 -> 비회원
        //member2 -> 비회원
        //member3 -> member3
        //member4 -> member4
        List<Member> memberList = jpaQueryFactory
                .selectFrom(member)
                .fetch();
    }

2) Add

  • 마이너스는 없기 때문에 Add(-1) 해주면 된다.
@DisplayName("bulkAdd")
    @Test
    void bulkAdd() {
        long count1 = jpaQueryFactory
                .update(member)
                .set(member.age, member.age.add(1))
                .execute();

        long count2 = jpaQueryFactory
                .update(member)
                .set(member.age, member.age.multiply(2))
                .execute();
    }

3) delete

@DisplayName("bulkDelete")
    @Test
    void bulkDelete() {
        long count = jpaQueryFactory
                .delete(member)
                .where(member.age.gt(18))
                .execute();
    }
profile
하루 일지 보단 행동 고찰 과정에 대한 개발 블로그

0개의 댓글