13.4.6. 一括更新、挿入、削除について
Hibernate では、Data Manipulation Language (DML) を使用して、Hibernate Query Language を介して、マップされたデータベースにへのデータの直接挿入、更新、および削除を一括で行うことができます。
警告
複数のオブジェクトまたは関係マッピングに違反し、オブジェクト状態に影響を与える可能性があります。オブジェクト状態は、基盤のデータベースで実行される操作によって、メモリー内オブジェクトの状態が影響を受けることはありません。インメモリーデータは、インメモリーデータが使用される場合は注意して使用する必要があります。
UPDATE および DELETE ステートメントの疑似構文は次のとおりです。(更新 | 削除)FROM?EntityName (WHERE where_conditions)?.
注記
FROM
キーワードおよび WHERE Clause
はオプションです。
UPDATE ステートメントまたは DELETE ステートメントの実行結果は、実際に影響を受ける (更新または削除される) 行数です。
例13.5 一括更新ステートメント
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlUpdate = "update Company set name = :newName where name = :oldName"; int updatedEntities = s.createQuery( hqlUpdate ) .setString( "newName", newName ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close();
例13.6 一括削除ステートメント
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlDelete = "delete Company where name = :oldName"; int deletedEntities = s.createQuery( hqlDelete ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close();
Query.executeUpdate() メソッドによって返される
int
値は、オペレーションの影響を受けた、データベース内のエンティティーの数を示します。
内部では、複数の SQL ステートメントを使用して、DML Update または Delete 更新リクエストまたは削除リクエストに応答して操作を実行する場合があります。これは、テーブルと、更新または削除が必要な結合テーブルの間に存在する関係が原因です。
たとえば、(上記の例のように) delete ステートメントを実行すると、
oldName
という名前の企業用の Company
テーブルだけでなく、結合したテーブルに対しても削除が実行されます。したがって、社員テーブルと双方向の多対多リレーションシップを持つ会社テーブルでは、前述の例の実行が成功すると、対応する結合テーブル Company_Employee から
行が失われることになります。
上記の
int deletedEntries
値には、この操作によって影響を受けるすべての行の数 (結合テーブルの行を含む) が含まれます。
INSERT ステートメントの疑似構文は次のとおりです 。INSERTINTOEntityNameproperties_listselect_statement。
注記
INSERTINTO..のみSELECT...フォームがサポートされています。INSERTINTO ではありません..。VALUES...フォーム。
例13.7 一括挿入ステートメント
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlInsert = "insert into Account (id, name) select c.id, c.name from Customer c where ..."; int createdEntities = s.createQuery( hqlInsert ) .executeUpdate(); tx.commit(); session.close();
SELECT ステートメントを使用して
id
属性の値を指定しない場合、基礎となるデータベースが自動生成キーをサポートする限り、識別子が生成されます。この一括挿入操作の戻り値は、データベースで実際に作成されたエントリー数です。