벌크 연산

JPA 변경 감지로 공통된 값들을 조회하기엔 너무 벅차다. 또 변경된 데이터가 1000만 건이라면 1000만 건의 SQL을 실행해야한다.

이것을 해결하기 위한 연산이 벌크 연산이다.

쿼리 한 방으로 여러 테이블의 열 값을 변경할 수 있다.

예제

// Flush가 자동호출된다. commit, query 나갈때 자동으로 호출된다.
int resultCount = em.createQuery("update Member m set m.age = 20")
		.executeUpdate();

모두 20살로 바뀐다. 파라미터 셋팅하면 개별로도 가능하다.

/*
		재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면?
*/

String qlString = "update Product p " +
"set p.price = p.price * 1.1 " +
                  "where p.stockAmount < :stockAmount";
                  
int resultCount = em.createQuery(qlString)
                    .setParameter("stockAmount", 10)
                    .executeUpdate();

주의

벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리를 날리기 때문에 영속성 컨텍스트에 들어있던 값과 정합성이 안맞을 수 있다.

이때는 그냥 벌크 연산을 수행하고, 영속성 컨텍스트를 초기화 시켜주면 된다.