1. ホーム
  2. java

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で囲み、自己責任で使用してください。