如何查看由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") &amp;&amp; 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

休眠日志记录在WildFly中