1. ホーム
  2. Hibernate

Hibernateのhqlです。INSERT INTO ...のみ SELECT ... 形式のみがサポートされます。

2022-02-16 07:49:39
<テーブル 13.4. DMLスタイルの操作 Prev 第13章. バッチ処理 次のページ

13.4. DMLスタイルの操作

既に述べたように、自動的で透過的なオブジェクト/リレーショナルマッピングは、オブジェクトの状態の管理に関係している。これは、オブジェクトの状態がメモリ上で利用可能であることを意味し、それゆえ、(SQLの Data Manipulation Language (DML)ステートメントを使用します。 INSERT , UPDATE , DELETE しかし、Hibernate は SQL スタイルの DML 文を一括実行するメソッドを提供しており、これは Hibernate クエリ言語 (日本語) を通して実行されます。 HQL ).

の擬似構文です。 UPDATE DELETE ステートメントは ( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)? . 注意すべき点もあります。

  • from-clauseでは、FROMキーワードはオプションです。

  • from-clauseに指定できるエンティティは1つだけで、オプションでエイリアスを指定することができます。エンティティ名がエイリアスである場合、すべてのプロパティ参照はそのエイリアスを使用して修飾する必要があります。エンティティ名がエイリアスでない場合、すべてのプロパティ参照は修飾することは違法です。

  • いいえ 参加 (は、バルク HQL クエリで指定することができます(暗黙的または明示的)。サブクエリはwhere-clauseで使用することができ、サブクエリ自体に結合を含めることができます。

  • where-clauseも省略可能である。

例として、HQLを実行する場合 UPDATE を使用します。 Query.executeUpdate() メソッド (このメソッドは、JDBC の PreparedStatement.executeUpdate() ):

Session session = sessionFactory.openSession();





Transaction tx = session.beginTransaction();








String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";





// or String hqlUpdate = "update Customer set name = :newName where name = :oldName";





int updatedEntities = s.createQuery( hqlUpdate )





        .setString( "newName", newName )





        .setString( "oldName", oldName )





        .executeUpdate();





tx.commit();





session.close();


UPDATE
version
timestamp
versioned update
VERSIONED
UPDATE
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlVersionedUpdate = "update versioned Customer set name = :newName where name = :oldName"; int updatedEntities = s.createQuery( hqlUpdate ) .setString( "newName", newName ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close();
org.hibernate.usertype.UserVersionType
update versioned

HQL DELETE 文は、デフォルトでは バージョン または タイムスタンプ これは、EJB3 の仕様に沿ったものです。ただし、Hibernate に強制的に Query.executeUpdate() または Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlDelete = "delete Customer c where c.name = :oldName"; // or String hqlDelete = "delete Customer where name = :oldName"; int deletedEntities = s.createQuery( hqlDelete ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close(); プロパティ値を int . これを実現するには Query.executeUpdate() キーワードの後に INSERT キーワードを使用します。

INSERT INTO EntityName properties_list select_statement


column speficiation
INSERT
INSERT
Type
org.hibernate.type.DateType
org.hibernate.id.SequenceGenerator
org.hibernate.id.PostInsertIdentifierGenerator
org.hibernate.id.TableHiLoGenerator

なお、カスタムバージョンタイプ( version ) と共に使用することはできません。 timestamp ステートメントを使用します。

HQLを実行するには seed value の場合、同じ org.hibernate.type. メソッドを使用します。

INSERT


Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ... "; int createdEntities = s.createQuery( hqlInsert ) .executeUpdate(); tx.commit(); session.close(); http://blog.csdn.net/yehuiling/archive/2009/04/08/4057015.aspx
String hqlDelete = "delete Customer c where c.name = :oldName";
// or String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = s.createQuery( hqlDelete )
.setString( "oldName", oldName )
.executeUpdate();
tx.commit();
session.close();

int が返す値は Query.executeUpdate() このことは、データベース内の影響する行の数と相関があるかもしれないし、ないかもしれないことを考慮してください。HQLの一括操作では、例えばjoined-subclassの場合、複数の実際のSQL文が実行されるかもしれません。JOINED-SUBCLASS の例に戻ると、サブクラスの 1 つに対する削除は、実際には、そのサブクラスがマッピングされているテーブルだけでなく、quot;ルート" テーブル、および継承階層のさらに下の JOINED-SUBCLASS テーブルに対しても削除が発生する可能性があります。

の擬似構文です。 INSERT ステートメントがあります。 INSERT INTO EntityName properties_list select_statement . 注意すべき点もあります。

  • INSERT INTO ... だけです。SELECT ...フォームのみがサポートされ、INSERT INTO ...フォームはサポートされません。VALUES ... フォームではありません。

    properties_list は column speficiation をSQLの INSERT マップされた継承に関わるエンティティでは、その与えられたクラスレベルで直接定義されたプロパティのみをproperties_listで使用することができます。スーパークラス・プロパティは許可されません。 INSERT 文は本質的に非ポリモーフィックである。

  • select_statementは、有効なHQL selectクエリにすることができます。ただし、戻り値の型は、挿入によって期待される型と一致しなければならないという注意点があります。しかし、これはHibernateの Type であるものは 等価 に対して イコール . として定義されたプロパティの間でミスマッチの問題が発生する可能性があります。 org.hibernate.type.DateType として定義されたプロパティと org.hibernate.type.TimestampType たとえ、データベースが区別しないか、変換を処理できるとしてもです。

  • idプロパティについては、insert文では2つのオプションがあります。properties_list で id プロパティを明示的に指定するか(この場合、その値は対応する select 式から取得されます)、properties_list から省略するか(この場合、生成された値が使用されます)です。このオプションは、データベースで動作するidジェネレータを使用する場合にのみ有効です。このオプションを任意のquot;in memory"型ジェネレータで使用しようとすると、パース時に例外が発生します。この議論では、データベース内ジェネレータは、次のように見なされることに注意してください。 org.hibernate.id.SequenceGenerator (とそのサブクラス)を実装している。 org.hibernate.id.PostInsertIdentifierGenerator . ここで最も注目すべき例外は org.hibernate.id.TableHiLoGenerator これは、その値を取得するための選択可能な方法を公開していないため、使用できません。

  • としてマッピングされたプロパティの場合 version または timestamp プロパティは、properties_listで指定するか(この場合、その値は対応するselect式から取得されます)、properties_listから省略するか(この場合、その値は対応するselect式から取得されます。 seed value で定義される org.hibernate.type. が使用されます)。

HQLの例 INSERT 文の実行です。

Session session = sessionFactory.openSession();


Transaction tx = session.beginTransaction();
String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ... ";
int createdEntities = s.createQuery( hqlInsert )
.executeUpdate();
tx.commit();
session.close();
http://blog.csdn.net/yehuiling/archive/2009/04/08/4057015.aspx