13.4.3. INSERT ステートメントについて
HQL は、
INSERT
ステートメントを定義する機能を追加します。これと同等の JPQL はありません。HQLINSERT
ステートメントの 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
ステートメントの column specification
に似ています。マッピングされた継承に関連するエンティティーでは、名前付きエンティティーに直接定義された属性のみが attribute_list
で使用できます。スーパークラスプロパティーは許可されておらず、サブクラスプロパティーは意味を成しません。つまり、INSERT
ステートメントは本質的にはポリモーフィックではありません。
警告
select_statement
には、有効な HQL 選択クエリーを使用できます。この場合、戻り値のタイプは挿入で想定されるタイプと一致する必要があります。現在、これは、チェックによるデータベースへの再参照を許可するのではなく、クエリーのコンパイル時に確認されます。これにより、equal ではなく equivalent である Hibernate タイプ間で問題が発生する可能性があります。たとえば、これは org.hibernate.type.DateType
としてマップされた属性と org.hibernate.type.TimestampType
として定義された属性の間でミスマッチの問題を引き起こす可能性があります。
id
属性には、insert ステートメントに 2 つのオプションを付与します。attribute_list
で id
プロパティーを明示的に指定することができます。この場合、その値は、対応する select 式から取得されるか、または生成された値が使用される場合は attribute_list
から省略されます。後者のオプションは、データベースで (in the database) で動作する ID
ジェネレーターを使用している場合にのみ利用できます。メモリー内 (in memory) タイプジェネレーターでこのオプションを使用しようとすると、解析中に例外が発生します。
ロック属性の場合、insert ステートメントでは、以下のいずれかのオプションが再度提供されます。
attribute_list
に属性を指定できます。この場合、その値は対応する select 式から取得されます。あるいは、attribute_list
から除外できます。その場合は、対応する select 式によって定義される seed value
が使用されます。 org.hibernate.type.VersionType
使用されている。
例13.3 INSERT
クエリーステートメント
String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ..."; int createdEntities = s.createQuery( hqlInsert ).executeUpdate();