반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 페치조인
- 페이징
- @MappedSuperclass
- 컬렉션 조회 최적화
- JPA
- SQL
- JPQL
- fetch join
- 데이터베이스
- 자바의 정석
- 데이터모델링
- 정렬
- index
- 엔티티
- 스프링
- 서브쿼리
- 친절한 SQL 튜닝
- querydsl
- 값 타입
- 오라클
- INDEX SCAN
- 스프링 데이터 JPA
- 그룹함수
- DTO
- 성능최적화
- TCP/IP
- Spring data JPA
- 스프링 컨테이너
- SQL 튜닝
- Spring
Archives
- Today
- Total
nu_s
[Spring Data JPA] 벌크성 수정 쿼리 🍀 본문
728x90
반응형
벌크성 수정 쿼리
- 데이터 한 건 씩이 아닌 모든 데이터에 일관적인 업데이트를 날려야 하는 경우를 벌크성 수정 쿼리라 한다.
JPA
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();
}
스프링 데이터 JPA
@Modifying
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
- 순수 JPA에서는 executeUpdate()를 사용했다.
- 스프링 데이터 JPA에서는 @Modifying 어노테이션을 사용한다.
- 사용하지 않으면 다음과 같은 예외가 발생한다.
주의점
- JPA에서 데이터는 영속성 컨텍스트를 통해 관리가 된다.
- 그러나 벌크성 쿼리는 영속성 컨텍스트를 거치지 않고 데이터베이스에 직접적으로 쿼리를 보낸다.
- 따라서 영속성 컨텍스트에 있는 엔티티의 값과 데이터베이스의 값이 다르게 나타난다.
해결 방법
- 벌크성 쿼리를 사용하고 난 후 영속성 컨텍스트를 초기화 시켜 DB에서 새로 값을 가져오게 만들자.
@Persistence EntityManager em;
@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);
// em.flush();
em.clear(); // 영속성 컨텍스트 초기화
List<Member> result = memberRepository.findByUsername("member5");
Member member = result.get(0);
System.out.println("member = " + member);
assertThat(resultCount).isEqualTo(3);
}
- 그러나 스프링 데이터 JPA에서는 자동으로 초기화해주는 기능을 제공한다.
@Modifying(clearAutomatically = true)
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
int bulkAgePlus(@Param("age") int age);
- @Modifying 어노테이션에 clearAutomatically를 true로 설정해주면 된다.
- 그러면 update 쿼리가 발생한 후 자동으로 영속성 컨텍스트를 초기화해준다.
출처 : 인프런 실전! 스프링 데이터 JPA
728x90
반응형
'Spring Data JPA' 카테고리의 다른 글
[Spring Data JPA] JPA Hint & Lock 🍀 (0) | 2023.12.04 |
---|---|
[Spring Data JPA] @EntityGraph 🍀 (0) | 2023.12.03 |
[Spring Data JPA] 페이징 & 정렬 🍀 (0) | 2023.12.01 |
[Spring Data JPA] 파라미터 바인딩 & 반환 타입 🍀 (0) | 2023.11.29 |
[Spring Data JPA] 쿼리 메서드 🍀 (0) | 2023.11.29 |