我想在开发过程中将 EclipseLink 生成的 SQL 输出到控制台。但是,我只能使用日志级别 FINE 来执行此操作。我有一个由许多类组成的复杂域模型,当日志详细程度处于 FINE 级别时,部署需要大量时间,因为 EclipseLink 输出其对整个模型的分析。
有没有办法在不使用日志级别 FINE 的情况下获取 SQL(就像 Hibernate 一样)?
我想在开发过程中将 EclipseLink 生成的 SQL 输出到控制台。但是,我只能使用日志级别 FINE 来执行此操作。我有一个由许多类组成的复杂域模型,当日志详细程度处于 FINE 级别时,部署需要大量时间,因为 EclipseLink 输出其对整个模型的分析。
有没有办法在不使用日志级别 FINE 的情况下获取 SQL(就像 Hibernate 一样)?
将以下属性放入您的persistence.xml
:
<property name="eclipselink.logging.level.sql" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
后者很有帮助,因此可以显示参数的值。
另一种方法是使用log4jdbc或log4jdbc-remix。
根据这个线程,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 ”记录了这些属性。
要在运行时获取特定查询的 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