如何以编程方式将 HQL 转换为 SQL 查询(无日志记录)

2022-09-03 13:53:28

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

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

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

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


答案 1

您可以使用休眠查询翻译器:

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

答案 2

我相信你想要前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();

推荐