JPA 2.1 の 新機能 バルクオペレーション まとめ


f:id:Naotsugu:20150313213957p:plain

JPA 2.1 で Criteria API 経由での一括更新と一括削除が可能となりました。

Criteria API の変更点

JPA 2.1 では CriteriaUpdateCriteriaDelete インターフェースが追加され、 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

えーと、これだけです。