본문 바로가기
백엔드/JPA

스프링 데이터 jpa 벌크 쿼리

by 김어찐 2021. 10. 23.
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