複数のレコードを一括して更新することをバルク更新といいます。バルク更新をするには,バルクUPDATE文およびバルクDELETE文を使用します。バルクUPDATEとDELETEの操作は,単体のエンティティクラスまたはサブクラスと合わせたエンティティクラスに適用されます。UPDATE文ではUPDATE節に,DELETE文ではFROM節に識別変数を定義して,1種類のエンティティを指定します。
バルクUPDATE文およびバルクDELETE文を使用するときの注意時について説明します。
- delete操作は,指定されたクラスとそのサブクラスのエンティティにだけ適用されます。関係するエンティティへのカスケードはされません。
- update操作で指定される更新値(new_value)は,割り当てられたフィールドの型との互換性が必要です。互換性がない場合は例外が発生します。
- バルクUPDATE文は,楽観的ロックを掛けないでデータベースの更新操作を実行するため,楽観的ロックに関する処理は実行しません。このため,バージョン列の値を手動で参照・更新する必要があります。
- 注意
- バルクUPDATE文やバルクDELETE文を実行するときは,データベースと活性化している永続化コンテキストのエンティティとの間で不一致になるため注意が必要です。バルクUPDATE文とバルクDELETE文での操作は,トランザクションと切り離したところで実行するか,トランザクションの開始時に実行する必要があります。
バルクUPDATE文およびバルクDELETE文の記述例を次に示します。
UPDATE EMPLOYEE
SET MONTHLY_SALARY = MONTHLY_SALARY + 1000
WHERE DEPARTMENT_ID = 3
DELETE FROM EMPLOYEE e
WHERE e.EMPLOYEE_NAME IS NULL AND e.monthlySalary IS EMPTY |
なお,バルクUPDATE文,バルクDELETE文の構文については,「付録D JPQLのBNF」を参照してください。