Search
〰️

벌크성 수정 쿼리

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
복사