如何打印LIMIT和OFFSET的SQL参数

Mas*_*ada 6 java hibernate jpa

概括

我正在使用 JPA (Hibernate) 编写代码,并且想检查日志中的 LIMIT 和 OFFSET 参数。

我添加了 Logback 并正确设置了日志级别,但我不能执行上述操作。我怎样才能做到这一点?

环境

  • 采用OpenJDK 11.0.4
  • 休眠 5.4.4.Final
  • Logback经典版1.2.3
  • MySQL 8.0.17

日志记录文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%-5level][%-10thread] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>

    <!-- Print SQL to log-->
    <logger name="org.hibernate.SQL" level="DEBUG" />
    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
</configuration>
Run Code Online (Sandbox Code Playgroud)

我使用 JPA 的 Java 代码

EntityManagerFactory emf = Persistence.createEntityManagerFactory("FooPU");
EntityManager em = emf.createEntityManager();
String jpql = "SELECT f FROM Foo f ORDER BY f.id";

// Specify LIMIT and OFFSET
List<Foo> fooList =  = em.createQuery(jpql, Foo.class)
        .setFirstResult(1)
        .setMaxResults(3)
        .getResultList();

for (Foo f : fooList) {
    System.out.println(f);
}
em.close();
emf.close();
Run Code Online (Sandbox Code Playgroud)

日志(实际)

没有显示 LIMIT 和 OFFSET 参数。我只能看到一条 SQL。

[DEBUG][main      ] org.hibernate.SQL - select foo0_.id as id1_1_, ... from Foo foo0_ order by foo0_.id limit ?, ?
Run Code Online (Sandbox Code Playgroud)

另外,其他 SQL 参数也正确显示。

[DEBUG][main      ] org.hibernate.SQL - select foo0_.id as id1_0_0_, ... from Foo foo0_ where foo0_.id=?
[TRACE][main      ] o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - [10]
Run Code Online (Sandbox Code Playgroud)

日志(预期)

[DEBUG][main      ] org.hibernate.SQL - select foo0_.id as id1_1_, ... from Foo foo0_ order by foo0_.id limit ?, ?
[TRACE][main      ] o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [INTEGER] - [1]
[TRACE][main      ] o.h.type.descriptor.sql.BasicBinder - binding parameter [2] as [INTEGER] - [3]
Run Code Online (Sandbox Code Playgroud)

Kaz*_*izu 4

可能目前还不支持。PreparedStatement通常参数通过ValueBinder接口(实际上是扩展的类BasicBinder)绑定到 a ,BasicBinder具有将绑定参数打印到日志的功能。但 limit/offset 参数绑定到一个PreparedStatement没有ValueBinder接口的接口,因此 limit/offset 参数不会打印到日志中。我建议创建一个支持将限制/偏移参数打印到日志的新问题!

  • 遇到同样的问题... (2认同)