在没有hibernate_show_sql = true的情况下将Hql转换为Sql Query

13 hibernate hql

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

String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();
Run Code Online (Sandbox Code Playgroud)

现在我也想在日志中记录后端生成的sql以供支持用户使用,我想利用QueryTranslator请指教如何为相应的HQL生成sql请告知如何实现这一点.

Abo*_*emi 6

你可以使用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();
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这不适用于Hibernate 5 :(有新的第5个参数`EntityGraphQueryHint`. (4认同)
  • 你可以传递null作为第五个参数.它应该工作. (3认同)

CPr*_*ott 5

我相信你想要前两个答案的组合

  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();
Run Code Online (Sandbox Code Playgroud)

  • createQueryTranslator 还需要一个参数:**EntityGraphQueryHint**。 (3认同)

Ash*_*ral -3

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

String queryString = query.unwrap(org.hibernate.Query.class).getQueryString();
Run Code Online (Sandbox Code Playgroud)

  • 哪个版本的 hibernate 有带有 unwrap 方法的查询? (5认同)
  • 这只适用于获取 HQL 查询,不适用于 SQL 查询 (4认同)