如何查看由JPA发出的SQL查询?
当我的代码发出这样的呼叫:
entityManager.find(Customer.class, customerID);
我怎样才能看到这个调用的SQL查询? 假设我没有访问数据库服务器来分析/监视调用,有没有办法在我的IDE中logging或查看由JPA调用发出的相应的SQL查询? 我正在使用jTDS驱动程序针对SQL Server 2008 R2。
日志logging选项是特定于提供程序的。 您需要知道您使用的是哪个JPA实现。
-
hibernate( 见这里 ):
<property name = "hibernate.show_sql" value = "true" />
-
EclipseLink( 请参阅此处 ):
<property name="eclipselink.logging.level" value="FINE"/>
-
OpenJPA( 见这里 ):
<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
-
DataNucleus( 见这里 ):
将日志类别
DataNucleus.Datastore.Native
设置为一个级别,如DEBUG
。
另外,如果您使用的是EclipseLink并希望输出SQL参数值,则可以将此属性添加到persistence.xml文件中:
<property name="eclipselink.logging.parameters" value="true"/>
在EclipseLink中,在运行时获取特定查询的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
如果您使用hibernate和logback作为logging器,则可以使用以下(仅显示绑定而不显示结果):
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>return message.toLowerCase().contains("org.hibernate.type") && logger.startsWith("returning");</expression> </evaluator> <OnMismatch>NEUTRAL</OnMismatch> <OnMatch>DENY</OnMatch> </filter> </appender>
org.hibernate.SQL = DEBUG打印查询
<logger name="org.hibernate.SQL"> <level value="DEBUG" /> </logger>
org.hibernate.type = TRACE打印绑定,通常是打印结果,通过自定义filter将会被抑制
<logger name="org.hibernate.type"> <level value="TRACE" /> </logger>
你需要janino依赖(http://logback.qos.ch/manual/filters.html#JaninoEventEvaluator):;
<dependency> <groupId>org.codehaus.janino</groupId> <artifactId>janino</artifactId> <version>2.6.1</version> </dependency>
为了查看OpenJPA中的所有SQL和参数,将这两个参数放在persistence.xml中:
<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/> <property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" />
如果您想要查看与参数值和返回值完全一致的查询,则可以使用jdbc代理驱动程序。 它会拦截所有jdbc调用并logging它们的值。 一些代理人:
- log4jdbc
- jdbcspy
他们还可以提供一些额外的function,如测量执行查询的时间和收集统计数据。
使用log4j( src \ log4j.xml )的示例:
<?xml version="1.0" encoding="UTF-8" ?>
<appender name="CA" class="org.apache.log4j.AsyncAppender"> <param name="BufferSize" value="512"/> <appender-ref ref="CA_OUTPUT"/> </appender> <appender name="CA_OUTPUT" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p] %d %c %M - %m%n"/> </layout> </appender> <logger name="org.hibernate.SQL" additivity="false"> <level value="DEBUG"/> <appender-ref ref="CA"/> </logger> <root> <level value="WARN"/> <appender-ref ref="CA"/> </root>
有一个名为persistence.xml的文件按Ctrl + Shift + Rfind它,然后,有一个地方写了一些像showSQL。
把它说成是真的
我不确定服务器是否必须作为debugging模式启动。 检查控制台上创build的SQL。
请参阅无法使用Spring JPA供应商适配器使hibernate停止显示SQL
此外,如果使用WildFly / JBoss,则将org.hibernate的日志logging级别设置为DEBUG