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