spring data jpa : bulk update

This commit is contained in:
haerong22
2021-09-01 23:30:41 +09:00
parent aadc0919d6
commit db2fd7183f
4 changed files with 55 additions and 0 deletions

View File

@@ -68,4 +68,10 @@ public class MemberJpaRepository {
.setParameter("age", age)
.getSingleResult();
}
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();
}
}

View File

@@ -6,6 +6,7 @@ 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;
@@ -41,4 +42,9 @@ public interface MemberRepository extends JpaRepository<Member, Long> {
Page<Member> findPageByAge(int age, Pageable pageable);
Slice<Member> findSliceByAge(int age, Pageable pageable);
// @Modifying(clearAutomatically = true)
@Modifying
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
}

View File

@@ -106,4 +106,20 @@ class MemberJpaRepositoryTest {
assertEquals(3, members.size());
assertEquals(5, totalCount);
}
@Test
void bulkUpdate() {
// given
memberJpaRepository.save(new Member("member1", 10));
memberJpaRepository.save(new Member("member2", 19));
memberJpaRepository.save(new Member("member3", 21));
memberJpaRepository.save(new Member("member4", 33));
memberJpaRepository.save(new Member("member5", 40));
// when
int resultCount = memberJpaRepository.bulkAgePlus(20);
// then
assertEquals(3, resultCount);
}
}

View File

@@ -14,6 +14,8 @@ import org.springframework.data.domain.Sort;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
@@ -29,6 +31,8 @@ public class MemberRepositoryTest {
MemberRepository memberRepository;
@Autowired
TeamRepository teamRepository;
@PersistenceContext
EntityManager em;
@Test
void testMember() {
@@ -216,5 +220,28 @@ public class MemberRepositoryTest {
assertTrue(slice.isFirst());
assertTrue(slice.hasNext());
}
@Test
void bulkUpdate() {
// given
memberRepository.save(new Member("member1", 10));
memberRepository.save(new Member("member2", 19));
memberRepository.save(new Member("member3", 21));
memberRepository.save(new Member("member4", 33));
memberRepository.save(new Member("member5", 40));
// when
int resultCount = memberRepository.bulkAgePlus(20); // 벌크 연산에서는 영속성 컨텍스트에 관계없이 DB에 저장된다.
Member member5 = memberRepository.findMemberByUsername("member5");
assertEquals(40, member5.getAge()); // age 가 41이 아닌 40 이다. 영속성 컨텍스트에 아직 member5의 데이터가 남아있기 때문
em.flush(); // 커밋
em.clear(); // 영속성 컨텍스트를 직접 삭제 하거나 @Modifying(clearAutomatically = true) 옵션을 준다.
member5 = memberRepository.findMemberByUsername("member5");
assertEquals(41, member5.getAge()); // 영속성 컨텍스트에 캐시가 남아있지 않으므로 DB에서 가져온다.
// then
assertEquals(3, resultCount);
}
}