【问题标题】:Find Native SQL Query from TypedQuery从 TypedQuery 中查找本机 SQL 查询
【发布时间】:2018-03-07 11:39:34
【问题描述】:

我需要知道数据库上正在执行什么查询,以便检查是否可以改进它。

以下代码用于创建查询:

TypedQuery<OrderItem> orderItemTypedQuery = typedQuery.setParameter(OrderItemCriteria.CUSTOMER_ID_PARAM, criteria.getCustomerId());

String sqlQuery=orderItemTypedQuery.unwrap(org.hibernate.Query.class).getQueryString();

显示以下查询:

select generatedAlias0 from OrderItem as generatedAlias0 left join generatedAlias0.order as generatedAlias1 where ( generatedAlias0.status in (:param0) ) and ( generatedAlias0.hidden=:param1 ) and ( generatedAlias0.customer.id=:param2 ) and ( generatedAlias0.linkedOrderItem is null ) order by generatedAlias1.id desc, generatedAlias0.id desc

上面的查询不是本机查询(未设置参数),我正在尝试查找数据库上正在执行的内容,以便我可以检查查询是否很慢并且需要优化。

谢谢

【问题讨论】:

  • 最新版本的Hibernate,需要将class改为org.hibernate.query.Query.class

标签: java mysql sql


【解决方案1】:

实现这一点的最佳方法是激活日志,这让我可以看到原生查询的样子。 这是通过设置以下属性来完成的

<prop key="hibernate.show_sql">true</prop>

如果我理解正确的话,这个参数设置在不同的地方,有些人在他们的日志属性中设置它(记住语法不同) 其他在他们的配置。 在我的例子中,这是在处理 entityManager 属性的 xml 配置文件中设置的。希望这会有所帮助

【讨论】:

    【解决方案2】:

    不幸的是,没有直接的方法可以做到这一点。尽管 Hibernate 包含 .getSql() 的 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 2018-10-02
      • 2014-11-11
      • 2017-04-14
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多