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
'백엔드 > JPA' 카테고리의 다른 글
스프링 데이터 jpa 사용자 정의 repository 구현 (0) | 2021.10.23 |
---|---|
스프링 데이터 jpa 패치조인 @EntityGraph (0) | 2021.10.23 |
스프링 data jpa 페이징 (0) | 2021.10.23 |
스프링 데이터 JPA 복잡한 정적 쿼리 @Query (0) | 2021.10.22 |
스프링 데이터 JPA 기초 (0) | 2021.10.22 |