QueryDSL 벌크 쿼리

벌크 연산

  • 한 번에 여러 데이터를 수정 혹은 삭제하는 것을 의미합니다.
  • 영속성 컨텍스트를 무시하고 바로 DB에 반영합니다.
    • 영속성 컨텍스트와 DB의 상태가 달라지게 된다는 의미
    • 벌크 연산으로 대량의 데이터를 수정한 후 fetch()로 데이터를 조회했을 때 변경된 DB에서 값이 아닌 이미 영속성 컨텍스트에 존재하는 데이터를 가져오는 문제가 발생합니다.
    • 벌크 연산 이후 변경된 값을 가져오기 위해 EntityManager.flush()와 EntityManager.clear()를 통해서 영속성 컨텍스트 값을 버려야 합니다.

 

대량 데이터 수정

    // 20살보다 어리면 비회원으로 변경하기
    long count = jpaQueryFactory
            .update(member)
            .set(member.username, "비회원")
            .where(member.age.lt(19))
            .execute();
            
	// 모든 회원 나이 1씩 더하기
    long count = jpaQueryFactory
            .update(member)
            .set(member.age, member.age.add(1))
            .execute();

 

대량 데이터 삭제

    long count = queryFactory
            .delete(member)
            .where(member.age.lt(19))
            .execute();