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

时间:2010-03-03 19:41:54

标签: jpa eclipselink orm

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

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

3 个答案:

答案 0 :(得分:57)

将以下属性放入persistence.xml

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

后者很有用,因此显示了参数的值。

另一种方法是使用log4jdbclog4jdbc-remix

答案 1 :(得分:22)

根据 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”会记录这些属性。

答案 2 :(得分:10)

要在运行时获取特定Query的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