728x90
- 엔티티를 수정하려면 영속성 컨텍스트의 변경 감지 기능이나 병합을 사용한다.
- 하지만 이방법으로는 수백개 이상의 엔티티를 하나씩 처리하기에는 시간이 너무 오래 걸린다.
- 이럴 때 여러건을 한 번에 수정하거나 삭제하는 벌크 연산을 사용하면 된다.
String sqlString =
"update Product p " +
"setp.price = p.price * 1.1 " +
"where p.stockAmount < :stockAmount";
int resultCount = em.createQuery(qlString)
.setParameter("stockAmount", 10)
.executeUpdate();
- 벌크 연산은 executeUpdate() 메소드를 사용한다. 이 메소드는 벌크 연산으로 영향을 받은 엔티티 건수를 반환한다.
- 삭제도 같은 메소드를 사용한다. 아래는 100원 미만인 상품을 삭제하는 코드다.
String qlString =
"delete from Product p " +
"where p.price < :price";
int resultCount = em.createQuery(qlString)
.setParameter("price", 100)
.executeUpdate();
- 주의점 : 벌크연산을 사용할 때는 벌크 연산이 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리한다는 점에 주의
- 해결 방법 : 벌크 연산 먼저 실행 - 예를 들어 위에서 벌크 연산을 먼저 실행하고 나서 상품A를 조회하면 벌크 연산으로 이미 변경된 상품A를 조회하게 된다.
출처 : JAVA 표준 ORM JPA 프로그래밍 (저자 : 김영한)
728x90
'JPA' 카테고리의 다른 글
@Converter (부제 - 데이터 변환) (0) | 2022.06.21 |
---|---|
Spring data JPA 쿼리 생성 기능 (0) | 2022.06.19 |
컬렉션 엔티티 조회 + 페이징을 함께 해결 (feat. default_batch_fetch_size) (0) | 2022.06.16 |
QueryDSL(Criteria 보다 더 나은 JPQL 빌더) (0) | 2022.06.16 |
Criteria 기초(feat. JPQL의 빌더 클래스) (0) | 2022.06.16 |