我使用的是Spring Data JPA+QueryDSL。我创建这样的动态查询:
JPAQuery<Foo> query = jpaQueryFactory.select(...);
我发现了这篇老文章,它展示了如何用程序检索原生sql字符串:https://antoniogoncalves.org/2012/05/24/how-to-get-the-jpqlsql-string-from-a-criteriaquery-in-jpa/但这对我不起作用。
我试过这个:
String queryString1 = query.createQuery().unwrap(org.hibernate.query.Query.class).getQueryString();
String queryString2 = query.createQuery().unwrap(org.eclipse.persistence.jpa.JpaQuery.class).getDatabaseQuery().getSQLString();
第一个不返回本机sql,而是返回JPQL字符串,第二个则无法将org.hibernate.query.internal.QueryImpl
重新映射到org.eclipse.persistence.jpa.JpaQuery
。
附言:我已经在获取查询之前和之后进行了测试。
如果您需要Querydsl生成的本机SQL查询,那么您需要使用SQLQueryFactory而不是JPAQueryFactory。JPAQueryFactory返回的JPQL查询由JPA而不是Querydsl转换为SQL。