Hibernateのhqlです。INSERT INTO ...のみ SELECT ... 形式のみがサポートされます。
既に述べたように、自動的で透過的なオブジェクト/リレーショナルマッピングは、オブジェクトの状態の管理に関係している。これは、オブジェクトの状態がメモリ上で利用可能であることを意味し、それゆえ、(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
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例