ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Querydsl의 수정, 삭제 쿼리
    JPA/Querydsl 2023. 8. 13. 15:54

    벌크 연산

    @Test
    public void bulkUpdate() {
        long count = queryFactory
                .update(member)
                .set(member.username, "미성년자")
                .where(member.age.lt(23))
                .execute();// 업데이트 쿼리, 반환 타입은 영향을 받은 로우 수
    }

    member1과 member2의 이름을 미성년자라 수정하는 쿼리이다. 하지만 벌크 연산은 영속성 컨텍스트를 무시하고 바로 db를 수정하기 때문에 영속성 컨텍스트의 데이터와 db의 데이터가 달라서 충돌이 생길 수가 있다.

     

     

    이 상태에서 바로 select를 하면 영속성 컨텍스트에서 데이터를 가져오기 때문에 변경되지 않는 데이터가 나온다.

     

     

    벌크연산 - 영속성 컨텍스트 초기화 필요

    @Test
    public void bulkUpdate() {
        long count = queryFactory
                .update(member)
                .set(member.username, "미성년자")
                .where(member.age.lt(23))
                .execute();// 업데이트 쿼리, 반환 타입은 영향을 받은 로우 수
            
        em.flush();
        em.clear();
            
        List<Member> result = queryFactory.selectFrom(member).fetch();
    
        for (Member member : result) {
            System.out.println(member);
        }
    }

    벌크 연산을 사용하고 싶으면 em.flush()와 em.clear()로 영속성 컨텍스트를 초기화 시켜야한다.

     

     

     

    간단한 수정 쿼리

    @Test
    public void bulkAdd() {
        queryFactory
                .update(member)
                .set(member.age, member.age.add(1))
                .execute();
    }

    모든 member의 나이를 하나씩 증가하려면 set(member.age, member.age.add(1))을 해주면 된다. minus는 따로 없기 때문에 add(-1)로 사용해야 한다. 곱하기는 multiply(2)를 통해 곱할 수 있다.

     

     

     

    데이터 삭제 쿼리

    @Test
    public void bulkDelete() {
        queryFactory
                .delete(member)
                .where(member.age.gt(18)) // set이 아니라 where
                .execute();
    }

    삭제하는 delete 쿼리는 update가 아닌 delete 쿼리를 날리고 update에서 사용했던 set이 아니라 where절로 조건을 넣어준다.

    'JPA > Querydsl' 카테고리의 다른 글

    스프링 데이터 JPA와 Querydsl 동시 사용  (0) 2023.08.13
    Querydls 동적 쿼리 활용  (0) 2023.08.13
    Querydsl의 동적 쿼리  (0) 2023.08.13
    Dto로 프로젝션 결과 반환  (0) 2023.08.13
    Querydsl - Case 문  (0) 2023.08.13
Designed by Tistory.