JPA를 사용한 벌크성 수정 쿼리
•
MemberJpaRepository
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();
}
Java
복사
•
MemberJpaRepositoryTest
@Test
public void bulkUpdate() {
//given
memberJpaRepository.save(new Member("member1", 10));
memberJpaRepository.save(new Member("member1", 19));
memberJpaRepository.save(new Member("member1", 20));
memberJpaRepository.save(new Member("member1", 21));
memberJpaRepository.save(new Member("member1", 40));
//when
int resultCount = memberJpaRepository.bulkAgePlus(20);
//then
assertThat(resultCount).isEqualTo(3);
}
Java
복사
Spring Data JPA를 사용한 벌크성 수정 쿼리
•
MemberRepository
◦
@Modifying 어노테이션을 추가해야 Database에 update된다.
@Modifying
@Query("update Member m set m.age = m.age +1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
Java
복사
•
MemberRepositoryTest
@Test
public void bulkUpdate() {
//given
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));
//when
int resultCount = memberRepository.bulkAgePlus(20);
List<Member> result = memberRepository.findListByUsername("member5");
Member member5 = result.get(0); // bulk연산 -> jpa의 영속성 컨텍스트에는 age가 40살로 남아있음. db만 41살로 update된 상태
System.out.println("member5 = " + member5);
//then
assertThat(resultCount).isEqualTo(3);
}
Java
복사
→ bulkAgePlus 메소드 호출 후 (벌크 연산 후), update가 된 entity를 조회하면 data가 update되지 않은 채로 조회된다. bulk 연산은 jpa 영속성 컨텍스트를 거치지 않고 바로 Database를 update하기 때문!
◦
방법 1 : bulk 연산 이후 영속성 컨텍스트를 다 날린다.
entityManager.flush();
entityManager.clear()@Modifying(clearAutomatically = true)
@Query("update Member m set m.age = m.age +1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);;
Java
복사
◦
방법 2 : @Modifying 어노테이션에 Option을 추가한다.
@Modifying(clearAutomatically = true)
@Query("update Member m set m.age = m.age +1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
Java
복사