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

Saj*_*jee 148 java jpa

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

entityManager.find(Customer.class, customerID);
Run Code Online (Sandbox Code Playgroud)

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

axt*_*avt 321

日志选项是特定于提供程序的.您需要知道您使用哪个JPA实现.

  • 您可以将此行放在persistence.xml中,以用于任何有趣的主体.它会在<properties>节点下...抱歉,如果这很明显,我只是对自己放在哪里感到困惑. (51认同)
  • 使用Hibernate和log4j时,您还可以将"org.hibernate.SQL"记录器设置为DEBUG(http://www.javalobby.org/java/forums/t44119.html) (5认同)
  • @Sajee:你应该给这个答案一个复选标记,表明这是接受的答案.使用Hibernate对我很有用.如果您同意这个答案,那么您和回答者将在stackoverflow.com上获得更多积分和更多权限. (4认同)

The*_*zle 34

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

<property name="eclipselink.logging.parameters" value="true"/>
Run Code Online (Sandbox Code Playgroud)


Kuh*_*pid 15

如果您使用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>
Run Code Online (Sandbox Code Playgroud)

org.hibernate.SQL = DEBUG打印Query

<logger name="org.hibernate.SQL">
    <level value="DEBUG" />
</logger>
Run Code Online (Sandbox Code Playgroud)

org.hibernate.type = TRACE打印绑定,通常是结果,它将通过自定义过滤器进行抑制

<logger name="org.hibernate.type">
    <level value="TRACE" />
</logger>
Run Code Online (Sandbox Code Playgroud)

您需要janino依赖(http://logback.qos.ch/manual/filters.html#JaninoEventEvaluator):

<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>2.6.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)


Tom*_*asz 14

在EclipseLink中,为了在运行时获取特定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();
Run Code Online (Sandbox Code Playgroud)

这个SQL会包含什么?用于参数.要使用参数转换SQL,您需要具有参数值的DatabaseRecord.

DatabaseRecord recordWithValues= new DatabaseRecord();
recordWithValues.add(new DatabaseField("param1"), "someValue");

String sqlStringWithArgs = 
         databaseQuery.getTranslatedSQLString(session, recordWithValues);
Run Code Online (Sandbox Code Playgroud)

来源:如何获取查询的SQL


Ken*_*sen 11

我制作了一个我认为对其他人有用的备忘单。在所有示例中,format_sql如果您想将记录的查询保留在一行中(没有漂亮的打印),您可以删除该属性。

漂亮的打印 SQL 查询到标准输出,无需准备语句的参数,也无需优化日志框架

application.properties 文件:

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
Run Code Online (Sandbox Code Playgroud)

application.yml 文件:

spring:
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true
Run Code Online (Sandbox Code Playgroud)

漂亮的打印SQL查询使用日志框架预处理语句的参数

application.properties 文件:

spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
Run Code Online (Sandbox Code Playgroud)

application.yml 文件:

spring:
  jpa:
    properties:
      hibernate:
        format_sql: true
logging:
  level:
    org:
      hibernate:
        SQL: DEBUG
        type:
          descriptor:
            sql:
              BasicBinder: TRACE
Run Code Online (Sandbox Code Playgroud)

使用日志框架漂亮地打印没有准备好的语句参数的SQL 查询

application.properties 文件:

spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
Run Code Online (Sandbox Code Playgroud)

application.yml 文件:

spring:
  jpa:
    properties:
      hibernate:
        format_sql: true
logging:
  level:
    org:
      hibernate:
        SQL: DEBUG
Run Code Online (Sandbox Code Playgroud)

来源(和更多细节):https : //www.baeldung.com/sql-logging-spring-boot


jfc*_*edo 7

要查看OpenJPA中的所有SQL和参数,请将这两个参数放在persistence.xml中:

<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
<property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" />
Run Code Online (Sandbox Code Playgroud)


mat*_*lka 5

如果要查看确切的查询以及参数值和返回值,则可以使用jdbc代理驱动程序。它将拦截所有jdbc调用并记录其值。一些代理:

  • log4jdbc
  • jdbcspy

它们还可以提供一些其他功能,例如测量查询的执行时间和收集统计信息。