我希望在开发期间将EclipseLink生成的SQL输出到控制台。但是,我只能使用日志级别FINE来执行此操作。我有一个由许多类组成的复杂域模型,因为EclipseLink输出其对整个模型的分析,所以当日志详细程度在FINE级别时,部署需要相当多的时间。
有没有办法在不使用日志级别FINE的情况下获取SQL(如Hibernate那样)?
答案 0 :(得分:57)
将以下属性放入persistence.xml
:
<property name="eclipselink.logging.level.sql" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
后者很有用,因此显示了参数的值。
另一种方法是使用log4jdbc或log4jdbc-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);