3.4.11. CRUD 操作に対するカスタム SQL
Hibernate を使用すると、生成された各単一 SQL ステートメントをオーバーライドできます。ネイティブ SQL クエリの使用方法についてはすでに説明しましたが、エンティティのステータスをロードまたは変更するために使用される SQL ステートメントをオーバーライドすることもできます。
@SQLInsert
、@SQLUpdate
、@SQLDelete
、@SQLDeleteAll
はそれぞれ INSERT ステートメント、UPDATE ステートメント、DELETE ステートメント、DELETE ステートメントをオーバーライドしてすべてのエンティティを削除します。
ストアドプロシージャを呼び出す場合は、
callable
属性を true (@SQLInsert(callable=true, ...)
) に設定してください。
実行が正常に行われたことを確認するために、Hibernate を使用して以下の 3 つの方針のいずれかを定義できます。
- NONE: 確認が行われません。ストアドプロシージャは問題発生時に失敗してしまうでしょう。
- COUNT: 更新が成功したことを確認する rowcount の使用
- PARAM: COUNT と似ていますが、標準的なメカニズムではなく出力パラメータを使用します。
結果チェックスタイルを定義するには、
check
パラメータ (@SQLUpdate(check=ResultCheckStyle.COUNT, ...)
) を使用します。
また、ネイティブ SQL クエリまたは HQL クエリにより SQL ロードステートメントをオーバーライドすることもできます。
@Loader
アノテーションを使用して名前付きクエリを参照する必要があります。
まったく同じアノテーションセットを使用してコレクション関連のステートメントをオーバーライドできます。
@OneToMany @JoinColumn(name="chaos_fk") @SQLInsert( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = ? where id = ?") @SQLDelete( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = null where id = ?") private Set<CasimirParticle> particles = new HashSet<CasimirParticle>();
@OneToMany
@JoinColumn(name="chaos_fk")
@SQLInsert( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = ? where id = ?") @SQLDelete( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = null where id = ?")
private Set<CasimirParticle> particles = new HashSet<CasimirParticle>();
パラメータの順序は重要であり、順序 Hibernate ハンドルプロパティにより定義されます。
org.hibernate.persister.entity
レベルに対してデバッグロギングを有効にすることにより、予期された順序を確認できます。このレベルを有効にすると、 Hibernate はエンティティの作成、更新、削除などに使用される静的な SQL を出力します (予期されたシーケンスを確認するために、アノテーションを使用してカスタム SQL を含めないようにしてください (Hibernate により生成された静的な SQL をオーバーライドします))。
@org.hibernate.annotations.Table
と attributes sqlInsert
、sqlUpdate
、または sqlDelete
のいずれかあるいはすべてを使用して、セカンダリテーブルのために SQL ステートメントをオーバーライドすることもできます。
前の例は、該当するテーブル (プライマリまたはセカンダリ) に対してコメントを提供できることも示しています。このコメントは DDL 生成に使用されます。