是否可以使用 EclipseLink 输出生成的 SQL 而无需增加日志的详细程度?

Posted

技术标签:

【中文标题】是否可以使用 EclipseLink 输出生成的 SQL 而无需增加日志的详细程度?【英文标题】:Is it possible to output generated SQL using EclipseLink without having to increase log verbosity? 【发布时间】:2011-01-23 09:10:22 【问题描述】:

我想在开发过程中将 EclipseLink 生成的 SQL 输出到控制台。但是,我只能使用日志级别 FINE 来执行此操作。我有一个由许多类组成的复杂域模型,当日志详细程度为 FINE 级别时,部署需要大量时间,因为 EclipseLink 输出其对整个模型的分析。

有没有办法在不使用日志级别 FINE 的情况下获取 SQL(就像 Hibernate 一样)?

【问题讨论】:

【参考方案1】:

将以下属性放入您的persistence.xml

 <property name="eclipselink.logging.level.sql" value="FINE"/>
 <property name="eclipselink.logging.parameters" value="true"/>

后者很有帮助,因此参数的值会显示出来。

另一种方法是使用log4jdbc 或log4jdbc-remix。

【讨论】:

有没有办法通过 Spring 的 application.properties 文件来代替?【参考方案2】:

根据 this thread 的说法,EclipseLink 的日志生成似乎很难设置。

它提到了一个 persistence.xml 文件,您可以调整日志级别:

<property name="eclipselink.weaving" value="static" />
<property name="eclipselink.logging.level.sql" value="FINEST" />
<property name="eclipselink.logging.level" value="FINEST" />
<property name="eclipselink.logging.level.cache" value="FINEST" />

但可能需要一些其他设置。

由于Martin 记录below,“EclipseLink/Examples/JPA/Logging”记录了这些属性。

【讨论】:

是的,它有效。非常感谢!现在的新问题是 - 为什么它没有记录在某个地方?如果是,为什么不容易找到? ;) @javabeats 文档可以在EclipseLink Wiki 中找到(在那里搜索EclipseLink logging 时的第一个结果)。 @Martin 谢谢。我已将您的评论包含在答案中以提高知名度。 @Martin 请记住,这个问题已有 6 年历史,不确定当时是否记录在案...... 有没有办法通过 Spring 的 application.properties 文件来代替?【参考方案3】:

要在运行时获取特定查询的 SQL,您可以使用 DatabaseQuery API。

Query query = em.createNamedQuery("findMe"); 
Session session = em.unwrap(JpaEntityManager.class).getActiveSession(); 
DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery(); 
databaseQuery.prepareCall(session, new DatabaseRecord());

String sqlString = databaseQuery.getSQLString();

此 SQL 将包含 ?为参数。要使用参数翻译 SQL,您需要带有参数值的 DatabaseRecord。

DatabaseRecord recordWithValues= new DatabaseRecord();
recordWithValues.add(new DatabaseField("param1"), "someValue");

String sqlStringWithArgs = 
         databaseQuery.getTranslatedSQLString(session, recordWithValues);

来源:How to get the SQL for a Query

【讨论】:

非常有用。设置 Eclipse 链接以记录所有内容是大量垃圾邮件。这可以很容易地放入实用程序类中,并且可以精确地用于仅在感兴趣的地方记录 SQL。例如。在哪里试图找到合适的 SQL 索引来创建,而不是在其他地方。谢谢。 String sql = ((EJBQueryImpl) query).getDatabaseQuery().getTranslatedSQLString(entityManager.unwrap(JpaEntityManager.class).getSession(), new DatabaseRecord());

以上是关于是否可以使用 EclipseLink 输出生成的 SQL 而无需增加日志的详细程度?的主要内容,如果未能解决你的问题,请参考以下文章

EclipseLink/JPA 是不是有用于修改生成的 SQL 的插件框架?

JPA 使用指南 /Eclipselink/JPA 实体生成器

EclipseLink DDL 生成错误

在测试环境中使用 Eclipselink 和 h2 生成序列时出现异常

使用JPA + Eclipselink操作PostgreSQL数据库

使用JPA + Eclipselink操作PostgreSQL数据库