从TypedQuery中查找本机SQL查询

时间:2017-09-26 09:53:12

标签: sql

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

以下代码用于创建查询:

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

上面的查询不是原生的(参数设置没有设置),我试图找到数据库上正在执行的内容,以便我可以检查查询是否很慢并且需要优化。

由于

2 个答案:

答案 0 :(得分:0)

实现这一目标的最佳方法是激活日志,这样我就可以看到本机查询的样子。 这是通过设置以下属性

来完成的
<prop key="hibernate.show_sql">true</prop>

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

答案 1 :(得分:0)

不幸的是,没有直接的方法可以做到这一点。对于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();