2011-06-08 166 views
11

我可以知道如何从JPA查询获取sql吗?或者说,将JPA查询转换为SQL字符串?非常感谢你!我可以从JPA查询对象获取SQL字符串吗?

+0

你能更清楚地了解你想要的东西吗?即请发布“JPA查询”(标准查询?JPQL?),并且可能是您期望的输出类型的示例。另请告诉我们,您使用的JPA实现(OpenJPA,Hibernate等) – 2011-06-08 09:23:32

+0

对于hibernate实现:query.unwrap(org.hibernate.Query.class).getQueryString()。 – 2017-09-13 06:10:13

回答

6

如果你只是想知道你的JPQL或条件查询如何被翻译成你的数据库的SQL方言,你可以启用持久性XML细粒度的日志记录,然后看看你的日志文件。

属性名称和值取决于您的JPA实现。这里是的persistence.xml为EclipseLink的相关部分的一个例子:

<properties> 
    <property name="eclipselink.logging.level" value="FINEST"/> 
</properties> 
2

您可能感兴趣的是,如果有一种方法可以从javax.persistence.Query中提取JPQL字符串(包含params的占位符或params填充后的最终JPQL)(可能的子类之一是更精确), - 在这种情况下根据JPA规范合同是不可能的。然而,假设这可能是通过JPA实现的(例如,NamedQueryImpl可能具有#toJPQLString(),您可以通过投射来访问它),但是我对此抱有怀疑。 即使有可能我不认为这是一个很好的代码来执行这样的操作。我会建议找到另一个设计解决方案(并且你可以指定你有什么样的实际问题)。例如,如果您要动态构建查询,则可以使用JPA Criteria API,并且可以使用“构建”JPA查询来维护反映查询逻辑的内部数据结构。

3

除了能够像@马特方便的日志中提到,也可以得到与在运行时的EclipseLink特定查询的SQL字符串如here所述。

1

使用Hibernate作为供应商,您可以启用以下属性:

hibernate.show_sql 

所有SQL语句到控制台。这是设置日志类别org.hibernate.SQL进行调试的替代方法。 (例如true | false)

hibernate.format_sql 

漂亮地打印日志和控制台中的SQL。 (例如:true |假)

或者,你上面的说明可以启用日志记录到调试级别为记录器

org.hibernate.SQL 

日志中的所有SQL DML语句执行时为它们

8

对于的EclipseLink:您可以提取SQL方式如下:

query.unwrap(EJBQueryImpl.class).getDatabaseQuery().getSQLString() 

仅当之后查询已执行。

+1

为我工作,但我的项目没有EJBQueryImpl.class(我用String rtn = query.unwrap(org.hibernate.Query.class).getQueryString();) – John 2016-10-26 14:22:39

2

继卡罗尔的答案 - 这是可能的EclipseLink的执行语句之前检索SQL:

Session session = em.unwrap(JpaEntityManager.class).getActiveSession(); 
DatabaseQuery databaseQuery = query.unwrap(EJBQueryImpl.class).getDatabaseQuery(); 
databaseQuery.prepareCall(session, new DatabaseRecord()); 
Record r = databaseQuery.getTranslationRow(); 
String bound = databaseQuery.getTranslatedSQLString(session, r); 
String sqlString = databaseQuery.getSQLString(); 

要检索的SQL字符串在/执行后,它可能是最好的,而不是这样做的使用持久性代码:

<property name="eclipselink.logging.parameters" value="true"/> 
<property name="eclipselink.logging.level" value="FINE"/> 
相关问题