728x90
벌크 연산에 대한 설명은 지난 글에 있다.
참고: https://un-lazy-midnight.tistory.com/115
순수 JPA의 벌크성 쿼리
예제)
특정 나이 이상인 Member들의 나이를 1씩 증가시킨다.
Repository 코드)
@Repository
public class MemberJpaRepository {
public int bulkAgePlus(int age){
return em.createQuery("update Member m set m.age = m.age +1 where m.age >= :age")
.setParameter("age",age)
.executeUpdate();
}
테스트 코드)
@Test
public void bulkUpdate(){
//given
memberJpaRepository.save(new Member("member1",10));
memberJpaRepository.save(new Member("member2",19));
memberJpaRepository.save(new Member("member3",20));
memberJpaRepository.save(new Member("member4",22));
memberJpaRepository.save(new Member("member5",40));
//when
int resultCount = memberJpaRepository.bulkAgePlus(20);
//then
assertThat(resultCount).isEqualTo(3);
}
스프링 데이터 JPA의 벌크성 쿼리
예제)
특정 나이 이상인 Member들의 나이를 1씩 증가시킨다.
Repository 코드)
@Modifying
@Query("update Member m set m.age = m.age +1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
테스트 코드)
@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",22));
memberRepository.save(new Member("member5",40));
//when
int resultCount = memberRepository.bulkAgePlus(20);
//then
assertThat(resultCount).isEqualTo(3);
}
주의 사항
영속성 컨텍스트와 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",22));
memberRepository.save(new Member("member5",40));
//when
int resultCount = memberRepository.bulkAgePlus(20);
//영속성 컨텍스트 안의 데이터들을 지워버린다.
em.flush();
em.clear();
//then
assertThat(resultCount).isEqualTo(3);
}
영속성 컨텍스트와 flush()에 대한 설명은 이전 글을 참고하자.
https://un-lazy-midnight.tistory.com/87
https://un-lazy-midnight.tistory.com/88
728x90
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
Spring Data JPA | JPA 힌트 @QueryHint 와 Lock (1) | 2023.05.09 |
---|---|
Spring Data JPA | @EntityGraph란? (0) | 2023.05.09 |
Spring Data JPA | 순수 JPA와 스프링 데이터 JPA의 페이징과 정렬 비교하기 (0) | 2023.05.09 |
Spring Data JPA | 파라미터 바인딩과 반환 타입 (0) | 2023.05.09 |
Spring Data JPA | @Query, 값, DTO 조회하기 (0) | 2023.05.09 |