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

HQL は INSERT ステートメントを定義する機能を追加します。これに相当するステートメントは JPQL にはありません。HQL の INSERT ステートメントの BNF は次の通りです。
insert_statement ::= insert_clause select_statement

insert_clause ::= INSERT INTO entity_name (attribute_list)

attribute_list ::= state_field[, state_field ]*
attribute_list は、SQL INSERT ステートメントの column specification と似ています。マップされた継承に関係するエンティティーでは、名前付きエンティティー上で直接定義された属性のみを attribute_list で使用することが可能です。スーパークラスプロパティーは許可されず、サブクラスプロパティーは意味がありません。よって、 INSERT ステートメントは本質的に非多形となります。

警告

select_statement はあらゆる有効な HQL select クエリになりえますが、戻り型は挿入が想定する型と一致しなければなりません。現在、型の一致はクエリのコンパイル中にチェックされ、チェックはデータベースへ委譲されません。そのため、同じ Hibernate タイプではなく相当 する Hibernate タイプの間で問題が生じる可能性があります。例えば、データベースによって区別されず、変換処理を行える可能性があっても、org.hibernate.type.DateType としてマップされた属性と、 org.hibernate.type.TimestampType として定義された属性との不一致が問題となる可能性があります。
insert ステートメントは id 属性に対して 2 つのオプションを提供します。1 つ目は、id 属性を attribute_list に明示的に指定するオプションで、この場合、値は対応する select 式から取得されます。2 つ目は attribute_list に指定しないオプションで、この場合生成された値が使用されます。2 つ目のオプションは、「データベース内」で操作する id ジェネレーターを使用する場合のみ選択可能です。このオプションを「インメモリ」タイプのジェネレーターで使用すると構文解析中に例外が生じます。
insert ステートメントは楽観的ロックの属性に対しても 2 つのオプションを提供します。1 つ目は attribute_list に属性を指定するオプションで、この場合、値は対応する select 式から取得されます。2 つ目は attribute_list に指定しないオプションで、この場合、対応する org.hibernate.type.VersionType によって定義される seed value が使用されます。

例11.3 INSERT クエリステートメントの例

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