web-dev-qa-db-fra.com

Conversion de requêtes Hql en requêtes SQL sans hibernate_show_sql = true

J'exécute la HQL suivante et elle s'exécute correctement

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

Maintenant, je souhaite également enregistrer le SQL généré par le serveur dans des journaux pour les utilisateurs du support. Je souhaite utiliser QueryTranslator. Veuillez indiquer comment générer le SQL correspondant à HQL. Veuillez indiquer comment y parvenir.

12
user2707882

Vous pouvez utiliser 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();
5
Abolfazl Hashemi

Je crois que vous voulez une combinaison des 2 meilleures réponses

  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
CPrescott

vous pouvez obtenir la requête en utilisant la méthode de décompression.

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

J'ai trouvé la solution suivante sur le web:

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

Source: http://narcanti.keyboardsamurais.de/hibernate-hql-to-sql-translation.html

0
Alexander