web-dev-qa-db-ja.com

hibernate_show_sql = trueなしでHqlをSQLクエリに変換する

次のHQLを実行していますが、正しく実行されています

String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();

また、バックエンドで生成されたSQLをサポートユーザーのログに記録したいのですが、QueryTranslatorを利用したいので、対応するHQLのSQLを生成する方法を教えてください。これを実現する方法を教えてください。

13
user2707882

休止状態のQueryTranslatorを使用できます。

String hqlQueryString = hqlQuery.getQueryString();
ASTQueryTranslatorFactory queryTranslatorFactory = new ASTQueryTranslatorFactory();
SessionImplementor hibernateSession = entityManager.unwrap(SessionImplementor.class);
QueryTranslator queryTranslator = queryTranslatorFactory.createQueryTranslator("", hqlQueryString, Java.util.Collections.EMPTY_MAP, hibernateSession.getFactory());
queryTranslator.compile(Java.util.Collections.EMPTY_MAP, false);
String sqlQueryString = queryTranslator.getSQLString();
6

上位2つの回答の組み合わせが必要だと思います

  String hqlQueryString = query.unwrap(org.hibernate.Query.class).getQueryString();
  ASTQueryTranslatorFactory queryTranslatorFactory = new ASTQueryTranslatorFactory();
  SessionImplementor hibernateSession = em.unwrap(SessionImplementor.class);
  QueryTranslator queryTranslator = queryTranslatorFactory.createQueryTranslator("", hqlQueryString, Java.util.Collections.EMPTY_MAP, hibernateSession.getFactory());
  queryTranslator.compile(Java.util.Collections.EMPTY_MAP, false);
  String sqlQueryString = queryTranslator.getSQLString();
4
CPrescott

私はウェブで次の解決策を見つけました:

QueryTranslatorFactory translatorFactory = new ASTQueryTranslatorFactory();
SessionFactoryImplementor factory = (SessionFactoryImplementor) getSessionFactory();
QueryTranslator translator = translatorFactory.
        createQueryTranslator(hqlQueryText, hqlQueryText, Collections.EMPTY_MAP, factory);
translator.compile(Collections.EMPTY_MAP, false);
translator.getSQLString(); 

ソース: http://narcanti.keyboardsamurais.de/hibernate-hql-to-sql-translation.html

1
Alexander

これは機能しますが、他の回答には、最新バージョンの休止状態では問題があります。

String hqlQueryString = query.unwrap(org.hibernate.Query.class).getQueryString(); ASTQueryTranslatorFactory queryTranslatorFactory = new ASTQueryTranslatorFactory(); SessionImplementor hibernateSession = entityManager.unwrap(SessionImplementor.class); QueryTranslator queryTranslator = queryTranslatorFactory.createQueryTranslator( ""、hqlQueryString、Java.util.Collections.EMPTY_MAP、hibernateSession.getFactory()、null); queryTranslator.compile(Java.util.Collections.EMPTY_MAP、false);文字列sqlQueryString = queryTranslator.getSQLString();

0
bharal

unwrapメソッドを使用してクエリを取得できます。

String queryString = query.unwrap(org.hibernate.Query.class).getQueryString();
0
Ashish Thukral

これは、次のコードを使用して、Hibernateの新しいバージョンのTypedQueryでも可能です。

String hqlQueryString=typedQuery.unwrap(org.hibernate.query.Query.class).getQueryString();
        ASTQueryTranslatorFactory queryTranslatorFactory = new ASTQueryTranslatorFactory();
        SessionImplementor hibernateSession = entityManager.unwrap(SessionImplementor.class);
        QueryTranslator queryTranslator = queryTranslatorFactory.createQueryTranslator("", hqlQueryString, Java.util.Collections.EMPTY_MAP, hibernateSession.getFactory(), null);
        queryTranslator.compile(Java.util.Collections.EMPTY_MAP, false);
        String sqlQueryString = queryTranslator.getSQLString();
0