How to convert HQL to SQL Query programmatically (without logging) How to convert HQL to SQL Query programmatically (without logging) sql sql

How to convert HQL to SQL Query programmatically (without logging)


You can use 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();


I believe you want a combination of the top 2 answers

  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();


This is also possible with TypedQuery in later versions of Hibernate using the following code

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();