4.2. HQL ステートメントについて


HQL および Java Persistence クエリー言語は、SELECTUPDATE、および DELETE ステートメントの両方を許可します。さらに HQL では、SQL INSERT-SELECT と似た形式の INSERT ステートメントを使用できます。

以下の表は、さまざまな HQL ステートメントの Backus-Naur Form (BNF) 表記の構文を示しています。

Expand
表4.1 HQL ステートメント
ステートメント説明

SELECT

HQL における SELECT ステートメントの BNF は以下のとおりです。

select_statement :: =
        [select_clause]
        from_clause
        [where_clause]
        [groupby_clause]
        [having_clause]
        [orderby_clause]

UPDATE

HQL の UPDATE ステートメントの BNF は、Java Persistence クエリー言語と同じになります。

update_statement ::= update_clause [where_clause]

update_clause ::= UPDATE entity_name [[AS] identification_variable]
        SET update_item {, update_item}*

update_item ::= [identification_variable.]{state_field | single_valued_object_field}
        = new_value

new_value ::= scalar_expression |
                simple_entity_expression |
                NULL

DELETE

HQL の DELETE ステートメントの BNF は、Java Persistence クエリー言語と同じになります。

delete_statement ::= delete_clause [where_clause]

delete_clause ::= DELETE FROM entity_name [[AS] identification_variable]

INSERT

HQL の INSERT ステートメントの BNF は以下の通りです。

insert_statement ::= insert_clause select_statement

insert_clause ::= INSERT INTO entity_name (attribute_list)

attribute_list ::= state_field[, state_field ]*

これと同等の Java Persistence クエリー言語はありません。

警告

Hibernate では、DML (Data Manipulation Language) を使用して、HQL (Hibernate Query Language) を介して、マップされたデータベースにへのデータの直接挿入、更新、および削除を一括で行うことができます。

複数のオブジェクトまたは関係マッピングに違反し、オブジェクト状態に影響を与える可能性があります。オブジェクト状態は、基盤のデータベースで実行される操作によって、メモリー内オブジェクトの状態が影響を受けることはありません。インメモリーデータは、インメモリーデータが使用される場合は注意して使用する必要があります。

UPDATE ステートメントおよび DELETE ステートメント

UPDATE ステートメントおよび DELETE ステートメントの擬似構文は次のとおりです。

( UPDATE | DELETE ) FROM?EntityName (WHERE where_conditions)?.

注記

FROM キーワードおよび WHERE Clause はオプションです。FROM 句は、残りのクエリーで使用できるオブジェクトモデルタイプのスコープを定義します。また、残りのクエリーで使用できるすべての識別変数も定義します。WHERE 句では、返されるインスタンスの一覧を絞り込むことができます。

UPDATE ステートメントまたは DELETE ステートメントの実行結果は、実際に影響を受ける (更新または削除される) 行数です。

例: 一括更新ステートメント

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();

例: 一括削除ステートメント

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 テーブルだけでなく、結合したテーブルに対しても削除が実行されます。したがって、Employee テーブルと多対多関係の双方向の Company テーブルは、前回の例の実行に成功すると、一致する結合テーブル Company_Employee から行を失います。

上記の deletedEntries 値には、この操作によって影響を受けるすべての行の数 (結合テーブルの行を含む) が含まれます。

重要

一括更新や削除の操作の実行時には、アクティブな永続コンテキストでデータベースとエンティティー間で不整合が生じる可能性があるため注意が必要です。一般的に、一括更新および削除操作は、新しい永続コンテキストのトランザクション内で、またはこのような操作の影響を受ける可能性のある状態を持つエンティティーをフェッチまたはアクセスする前にのみ実行する必要があります。

INSERT ステートメントについて

HQL は、INSERT ステートメントを定義する機能を追加します。これと同等の Java Persistence クエリー言語はありません。HQL INSERT ステートメントの Backus-Naur Form (BNF) は以下の通りです。

insert_statement ::= insert_clause select_statement

insert_clause ::= INSERT INTO entity_name (attribute_list)

attribute_list ::= state_field[, state_field ]*

tribute_list は、SQL INSERT ステートメントのコラム指定に似ています。マッピングされた継承に関連するエンティティーでは、名前付きエンティティーに直接定義された属性のみが attribute_list で使用できます。スーパークラスプロパティーは許可されておらず、サブクラスプロパティーは意味を成しません。つまり、INSERT ステートメントは本質的にはポリモーフィックではありません。

警告

select_statement には、有効な HQL 選択クエリーを使用できます。この場合、戻り値のタイプは挿入で想定されるタイプと一致する必要があります。現在、これは、チェックによるデータベースへの再参照を許可するのではなく、クエリーのコンパイル時に確認されます。これにより、Hibernate Types が equal とは逆に equivalent であるため、問題が発生する可能性があります。たとえば、これにより、データベースが区別を行わなかったり、変換を処理できない場合でも、org.hibernate.type.DateType としてマップされた属性と org.hibernate.type.TimestampType として定義された属性間で不一致の問題が発生する可能性があります。

id 属性には、insert ステートメントに 2 つのオプションを付与します。attribute_listid プロパティーを明示的に指定することができます。この場合、その値は、対応する select 式から取得されるか、生成された値が使用される場合は attribute_list から省略されます。後者のオプションは、データベースで (in the database) で動作する ID ジェネレーターを使用している場合にのみ利用できます。メモリー内 (in memory) タイプジェネレーターでこのオプションを使用しようとすると、解析中に例外が発生します。

ロック属性の場合、insert ステートメントでは、以下のいずれかのオプションが再度提供されます。attribute_list に属性を指定できます。この場合、その値は対応する選択式から取得されます。あるいは、attribute_list から除外できます。その場合は、対応する org.hibernate.type.VersionType で定義される seed value が使用されます。

例: INSERT Query ステートメント

String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ...";
int createdEntities = s.createQuery(hqlInsert).executeUpdate();

例: Bulk Insert ステートメント

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 属性の値を指定しない場合、基礎となるデータベースが自動生成キーをサポートする限り、識別子が生成されます。この一括挿入操作の戻り値は、データベースで実際に作成されたエントリー数です。

Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る