如何配置JPA日志在控制台打印带Indexed参数的原生查询实际值
JPA原生Indexed参数查询的日志值展示问题
现状说明
基于JPA开发时,使用Indexed参数编写原生查询传递参数值的场景下,控制台日志仅输出SQL占位符?,无法查看实际传入的参数值,需要调整配置实现真实参数值的控制台打印。
当前实际日志输出样例:
org.hibernate.SQL : select * from car_records where carVinNo = ?
对应的Repository层查询代码:
public interface CarRepository extends JpaRepository<Car, String> { @Query(nativeQuery = true, value = "select * from car_records where carVinNo >= ?1") List<Car> retrieveCars(Long startRegTs); }
此前参考通用方案在yml中配置了如下日志规则,但始终无法输出实际参数值:
logging: level: org.hibernate.SQL: DEBUG org.hibernate.type: TRACE
正确可生效的配置方案
旧配置失效的核心原因是Hibernate版本迭代后,参数绑定逻辑的日志类路径发生调整,仅依靠旧版日志级别配置无法触发参数值输出,需要按适配的版本匹配对应配置项:
- 日志级别配置调整
按照项目使用的Spring Boot/Hibernate版本匹配对应的日志路径,可同时配置多版本兼容路径,避免版本切换后配置失效,配置示例:logging: level: # 打印完整原生SQL语句 org.hibernate.SQL: DEBUG # Hibernate 6.x(Spring Boot 3.x)版本:绑定参数的日志路径 org.hibernate.orm.jdbc.bind: TRACE # Hibernate 5.x(Spring Boot 2.x)版本:绑定参数的日志路径 org.hibernate.type.descriptor.sql.BasicBinder: TRACE - 补充Hibernate全局属性配置
开启SQL日志的格式化输出,避免单行日志过长难以阅读:spring: jpa: properties: hibernate: # 格式化输出SQL语句 format_sql: true
配置生效后,控制台会在SQL语句下方逐行打印实际绑定的参数值,这套配置不受参数是Indexed占位符还是命名占位符的影响,可统一输出真实参数内容,例如对应上述retrieveCars方法的输出效果:
org.hibernate.SQL : select * from car_records where carVinNo >= ?
org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [1697049600000]
内容的提问来源于stack exchange,提问作者Mar
相关产品推荐
相关产品推荐

