Преобразование 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();