Преобразование Hql в Sql Query без hibernate_show_sql = true

Я выполняю следующий HQL и правильно выполняю

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

Теперь я также хочу зарегистрировать sql, сгенерированный на бэкэнд в журналах для пользователей поддержки, я хочу использовать QueryTranslator, пожалуйста, сообщите, как я могу сгенерировать sql для соответствующего HQL, пожалуйста, сообщите, как это сделать.

Ответ 1

Вы можете использовать hibernate 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();

Ответ 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();

Ответ 3

вы можете получить запрос с помощью метода разворота.

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

Ответ 4

Я нашел следующее решение в Интернете:

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

Ответ 5

Это работает, другие ответы имеют проблему для современных версий гибернации:

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); String sqlQueryString = queryTranslator.getSQLString();