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

后端 未结 7 1138
刺人心
刺人心 2021-02-05 12:10

I am executing the following HQL and it is executing properly

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


        
相关标签:
7条回答
  • 2021-02-05 12:34

    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();
    
    0 讨论(0)
  • 2021-02-05 12:45

    This works, other answers have a problem for modern versions of hibernate:

    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();
    
    0 讨论(0)
  • 2021-02-05 12:49

    I found next solution on the 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 讨论(0)
  • 2021-02-05 12:51

    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();
    
    0 讨论(0)
  • 2021-02-05 12:51

    you can get the Query out by using the unwrap method.

    String queryString = query.unwrap(org.hibernate.Query.class).getQueryString();
    
    0 讨论(0)
  • 2021-02-05 12:53

    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();
    
    0 讨论(0)
提交回复
热议问题