JPA 2.1 で Criteria API 経由での一括更新と一括削除が可能となりました。
Criteria API の変更点
JPA 2.1 では CriteriaUpdate
と CriteriaDelete
インターフェースが追加され、 CriteriaBuilder の createCriteriaUpdate(Class<T> targetEntity)
と createCriteriaDelete(Class<T> targetEntity)
からバルク操作がサポートされます。
CriteriaUpdate
バルク更新には createCriteriaUpdate
を使います。
CriteriaUpdate<Customer> q = cb.createCriteriaUpdate(Customer.class); Root<Customer> c = q.from(Customer.class); q.set(c.get(Customer_.status), "outstanding") .where(cb.lt(c.get(Customer_.balance), 10000)); int rowCount = entityManager.createQuery(q).executeUpdate();
JPQL だと以下と等価です。
UPDATE Customer c SET c.status = 'outstanding' WHERE c.balance < 10000
CriteriaUpdate
バルク削除には createCriteriaDelete
を使います。
CriteriaDelete<Customer> q = cb.createCriteriaDelete(Customer.class); Root<Customer> c = q.from(Customer.class); q.where(cb.equal(c.get(Customer_.status), "inactive"), cb.isEmpty(c.get(Customer_.orders))); int rowCount = entityManager.createQuery(q).executeUpdate();
これは JPQL だと以下と同じになります。
DELETE FROM Customer c WHERE c.status = 'inactive' AND c.orders IS EMPTY
えーと、これだけです。