spring data jpa : bulk update
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user