JPA/Querydsl

Querydsl의 수정, 삭제 쿼리

chanhee01 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절로 조건을 넣어준다.