백엔드/JPA
스프링 데이터 jpa 벌크 쿼리
김어찐
2021. 10. 23. 00:36
728x90
인터페이스
package com.study.datajpa.repository;
import com.study.datajpa.dto.MemberDto;
import com.study.datajpa.entity.Member;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.Collection;
import java.util.List;
public interface MemberRepository extends JpaRepository<Member, Long> {
@Modifying(clearAutomatically = true) // 변경을 하는경우 추가해줘야함
@Query("update Member m set m.age = m.age+1 where m.age >=:age")
int bulkAgePlus(@Param("age") int age);
}
테스트 케이스
@Test
public void bulkUpdate() {
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));
int resultCount = memberRepository.bulkAgePlus(20);
List<Member> result = memberRepository.findByUsername("member5");
Member member5 = result.get(0);
System.out.println("member5 = " + member5);
// 결과가 41이 아닌 40으로 나옴
// 벌크연산은 DB에 바로 적용하고 영속성 컨텍스트에는 반영 안함
// 벌크연산후 영속성 컨텍스트 flush, clear 해주면 된다.
// 인터페이스에 @Modifying(clearAutomatically = true) 옵션 적용해주면 flush, clear 안해줘도 된다
em.flush();
em.clear();
result = memberRepository.findByUsername("member5");
member5 = result.get(0);
System.out.println("member5 = " + member5);
//결과 41 잘 나온다
assertThat(resultCount).isEqualTo(3);
}
728x90