如何查看JPA发出的SQL查询?

问题

当我的代码发出这样的调用时:

entityManager.find(Customer.class, customerID);

如何查看此调用的SQL查询?假设我没有访问数据库服务器来分析/监控调用,是否有办法在我的IDE中记录或查看JPA调用发出的相应SQL查询?我使用jTDS驱动程序反对SQL Server 2008 R2。


#1 热门回答(291 赞)

日志选项是特定于提供程序的。你需要知道你使用哪个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。

#2 热门回答(33 赞)

此外,如果你正在使用EclipseLink并希望输出SQL参数值,则可以将此属性添加到persistence.xml文件中:

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

#3 热门回答(13 赞)

如果你使用hibernate和logback作为记录器,则可以使用以下内容(仅显示绑定而不显示结果):

<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打印绑定,通常是结果,将通过自定义过滤器进行抑制

<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>