본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JPA/QueryDSL

QueryDSL 공부 7 - 수정 , 삭제 벌크성 쿼리

반응형

 

 

JPA에서는 주로 변경감지(dirty checking)을 통해 데이터의 update 가 일어나는데 이 경우에는 개별 엔티티에 대해서 건마다 쿼리가 나가기 때문에 쿼리 한번으로 대량 데이터를 수정할 때는 벌크연산을 사용한다 . 

 

 

QueryDsl에서 벌크연산 하는 방법을 알아 보자  

 

 

1. 모든엔티티의 특정 컬럼을 변경하고 싶을때 

 

    @Test
    public void bulk_update(){
        long count = qf
                .update(member)
                .set(member.username, "비회원")
                .where(member.age.lt(20))
                .execute();

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


        List<Member> fetch = qf.selectFrom(member).fetch();
        for (Member member : fetch) {
            System.out.println("member = " + member);
        }
    }

  벌크연산은 영속성컨텍스트를 무시하고 바로 DB로 쿼리를 날린다 , 벌크연산후 해당 데이터를 조회하여 DB에서 데이터 퍼온다고 해도
 영속성컨텍스트의 데이터가 우선되기 떄문에 영속성컨텍스트의 데이터가 리턴된다. 벌크연산 후에는 영속성 컨텍스트 초기화가 필요하다 

update() set() execute()를 통해 업데이트가 가능하다 . 

 

2.특정컬럼에 같은 값을 더하고 싶을때 

 

age 라는 컬럼이 있고 모든엔티티에 해당 컬럼에 1씩 더하고 싶다면

 

    @Test
    public void bulkAdd(){
        long execute = qf
                .update(member)
                //add , minus , multiple 다 가능하다.
                .set(member.age, member.age.add(1))
                .execute();
        em.clear();
        em.flush();

        List<Member> fetch = qf.selectFrom(member).fetch();
        for (Member member : fetch) {
            System.out.println("member = " + member);
        }
    }

 

add() , minus(),multiple() 등의 메서드를 모두 제공한다. set()에서 첫번째인자는 바꾸고 싶은 컬럼,  두번째는 바꿀값 을 지정 해주면된다  

 

3. 한번에 모두 삭제

 

    @Test
    void bulk_delete(){
        long execute = qf
                .delete(member)
                .execute();
        em.clear();
        em.flush();

        List<Member> fetch = qf.selectFrom(member).fetch();
        for (Member member : fetch) {
            System.out.println("member = " + member);
        }
    
    }

 

delete()를 사용하여 한번에 삭제 가능하다 . 

 

반응형