java - 从 TypedQuery 中查找 native SQL 查询

标签 java mysql 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

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

谢谢

最佳答案

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

关于java - 从 TypedQuery 中查找 native SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46423209/

相关文章:

java - Java 7 中是否有 ImmutableEnumSet 的计划?

Java异常问题

mysql - 需要特定的 mysql 语句才能在一次选择中获取主词和所有词

mysql - MySQL 中的 SELECT 树

java - Spring MVC 中的部署失败,并且未找到带有 URI 的 HTTP 请求的映射

java - JBoss 6 从 WEB-INF/lib of war 解压 jar

javascript - 将多个变量传递到 jquery 对话框表单

mysql - 执行 LOAD DATA LOCAL INFILE 时获取 mysql 错误代码 : 1265. 数据被列截断

sql - 将表列的数据类型从时间戳更改为 bigint

mysql - NOT FOUND Mysql 中更新过程的错误处理