36

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

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

4

3 回答 3

63

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

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

后者很有帮助,因此可以显示参数的值。

另一种方法是使用log4jdbclog4jdbc-remix

于 2011-09-05T12:57:22.427 回答
24

根据这个线程,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在下面记录的那样,“ EclipseLink/Examples/JPA/Logging ”记录了这些属性。

于 2010-03-03T19:54:58.827 回答
12

要在运行时获取特定查询的 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);

资料来源:如何获取查询的 SQL

于 2012-08-24T06:18:28.137 回答