Hibernate Criteria APIからSQLを取得する方法 (*ロギング用ではありません*)
2023-09-30 22:37:37
質問
Hibernate の
Criteria
?
理想はこんな感じです。
Criteria criteria = session.createCriteria(Operator.class);
... build up the criteria ...
... and then do something like ...
String sql = criteria.toSql()
(But this of course does not exist)
そして、このSQLを巨大な「MINUS」クエリの一部として使用することです(2つの同一のスキーマ(データではなく、構造において同一)の違いを見つける必要があり、MINUSはHibernateではサポートされていません)。
(ところで、私はログファイルからSQLをチェックすることができることを知っています)
どのように解決するのですか?
私はSpring AOPを使ってこのようなことをしました。HQL、Criteria、またはネイティブSQLであろうと、アプリケーションで実行されたすべてのクエリのSQL、パラメータ、エラー、実行時間を取得することができました。
これは明らかに壊れやすく、安全ではなく、Hibernateの変更によって壊れる可能性があるなどですが、SQLを取得することが可能であることを説明しています。
CriteriaImpl c = (CriteriaImpl)query;
SessionImpl s = (SessionImpl)c.getSession();
SessionFactoryImplementor factory = (SessionFactoryImplementor)s.getSessionFactory();
String[] implementors = factory.getImplementors( c.getEntityOrClassName() );
CriteriaLoader loader = new CriteriaLoader((OuterJoinLoadable)factory.getEntityPersister(implementors[0]),
factory, c, implementors[0], s.getEnabledFilters());
Field f = OuterJoinLoader.class.getDeclaredField("sql");
f.setAccessible(true);
String sql = (String)f.get(loader);
全体をtry/catchで囲み、自己責任で使用してください。
関連
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
Java基礎 - マッピングとQ/A
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL Serverでテーブルからカラム名を取得するにはどうすればよいですか?
-
[解決済み] T-SQLでnot equalには!=と<>のどちらを使うべきですか?
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] SQLデータベースのテーブルでn番目の行を選択する方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
Git Pull Failed マージされていないファイルがあるため、Pull できません。
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
API の戻り値を処理するために ResponseEntity を使用する
-
eclipse にリソースリーク:'in' が閉じない
-
Java の double データ型における 0.0 と -0.0 の問題
-
1分でわかる!恋人の写真をIDEAの背景画像に設定する方法【おすすめ集
-
ApiModel と @ApiModelProperty の使用法