16

我正在执行以下 HQL 并且它正在正确执行

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

现在,我还想将后端生成的 sql 记录在日志中以供支持用户使用。

我想使用 QueryTranslator 请告知如何为相应的 HQL 生成 sql 请告知如何实现这一点。

4

7 回答 7

7

您可以使用休眠 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();
于 2014-10-20T09:35:04.640 回答
5

我相信你想要前 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();
于 2017-10-24T22:14:41.197 回答
3

使用以下代码在 Hibernate 的更高版本中也可以使用 TypedQuery

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();
于 2019-12-28T01:16:05.383 回答
2

这行得通,其他答案对于现代版本的休眠有问题:

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();
于 2019-09-05T12:32:14.447 回答
2

我在网上找到了下一个解决方案:

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

于 2016-06-10T13:46:49.523 回答
1

休眠类型

从 2.9.11 版本开始,Hibernate Types开源项目提供的SQLExtractor实用程序允许您从任何 JPQL 或 Criteria API 查询中获取 SQL 查询,无论您使用的是 Hibernate 5.4、5.3、5.2、5.1、5.0、 4.3、4.2 或 4.1。

从 JPQL (HQL) 查询中获取 SQL 语句

假设我们有以下 JPQL (HQL) 查询:

Query jpql = entityManager.createQuery("""
    select 
       YEAR(p.createdOn) as year, 
       count(p) as postCount 
    from 
       Post p 
    group by 
       YEAR(p.createdOn)
    """, Tuple.class
);

使用 Hibernate 类型,提取 Hibernate 生成的 SQL 查询非常简单:

String sql = SQLExtractor.from(jpql);

而且,如果我们记录提取的 SQL 查询:

LOGGER.info("""
    The JPQL query: [
        {}
    ]
    generates the following SQL query: [ 
        {}
    ]
    """,
    jpql.unwrap(org.hibernate.query.Query.class).getQueryString(),
    sql
);

我们得到以下输出:

- The JPQL query: [
    select    
        YEAR(p.createdOn) as year,    
        count(p) as postCount 
    from    
        Post p 
    group by    
        YEAR(p.createdOn)
]
generates the following SQL query: [
    SELECT 
        extract(YEAR FROM sqlextract0_.created_on) AS col_0_0_,
        count(sqlextract0_.id) AS col_1_0_
    FROM 
        post p
    GROUP BY 
        extract(YEAR FROM p.created_on)
]

请注意,我们将 JPQL (HQL) 解包Query到 Hibernateorg.hibernate.query.Query接口,该接口提供了getQueryString我们可以用来记录关联的 JPQL 查询字符串的方法。

于 2020-06-02T14:40:05.713 回答
-2

您可以使用 unwrap 方法获取查询。

String queryString = query.unwrap(org.hibernate.Query.class).getQueryString();
于 2013-08-22T20:22:17.613 回答