是否可以使用 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 和 h2 生成序列时出现异常