[본 포스팅은 실전! 스프링 데이터 JPA -인프런 편을 기반으로 작성하였습니다.]
만약 나이가 20살 이상인 사람들의 나이를 +1 하려고 한다고 가정하자.
그러면 repository에서 다음과 같이 해주면 되는데
@Query로 쿼리를 직접 짜주고 @Modifying을 해주면 된다.
@Modifying(clearAutomatically = true) //변경한다고 알림, 영속성 콘텍스트 초기화
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
@Modifying을 해주는 이유는 데이터를 변경하기 때문에 사용하고 뒤에 clearAutomatically를 true 해주는 이유는
데이터가 변경이 될 때 영속성 콘텍스트를 거쳐서 변경하는 것이 아닌 바로 DB에 쏴준다.
따라서 영속성 콘텍스트를 초기화해주는 작업이 필요하다.
@Test
public void bulkUpdate() {
//given
memberRepository.save(new Member("member1", 10));
memberRepository.save(new Member("member2", 19));
memberRepository.save(new Member("member3", 20));
memberRepository.save(new Member("member4", 21));
memberRepository.save(new Member("member5", 40));
//when
int resultCount = memberRepository.bulkAgePlus(20);
//then
assertThat(resultCount).isEqualTo(3);
}
위 코드는 벌크성 수정 쿼리를 적용한 것이고 3개의 멤버만 영향을 받은 것을 볼 수 있다.
'JAVA > JPA' 카테고리의 다른 글
[JPA/QueryDSL] N+1 문제 해결하는 방법(EntityGraph, fetchJoin) (0) | 2023.05.31 |
---|---|
[JPA] Auditing을 사용해 등록일, 수정일, 등록자, 수정자 기록 남기기 (0) | 2023.01.03 |
[JPA] 스프링 데이터 JPA 페이징과 정렬 (feat. DTO를 사용해야 하는 이유) (0) | 2023.01.02 |
[JPA/JPQL] 페치 조인(fetch join)이란? 특징과 한계 - 엔티티 페치 조인, 컬렉션 페치 조인, DISTINCT로 중복 제거 (0) | 2022.12.29 |
[JPA] @MappedSuperclass로 공통 칼럼 상속받기 (0) | 2022.12.23 |