升级spring-data-jdbc至2.x后Repository的LocalDateTime参数报错
问题根因
Spring Boot 2.3 对应升级的 Spring Data JDBC 2.0.x 版本调整了 JSR310 时间类型的默认参数绑定逻辑,会将 LocalDateTime 先转为 java.util.Date 再传递给 JDBC 驱动,导致 PostgreSQL 无法正确识别参数类型,误将时间参数判定为 interval 类型。
可行解决方案(无需手动加 CAST)
方案1:全局自定义类型转换器(推荐,无业务代码侵入)
注册自定义写入转换器,强制指定 LocalDateTime 类型参数的 JDBC 类型为 TIMESTAMP,恢复旧版绑定逻辑:
- 实现转换器类
import org.springframework.core.convert.converter.Converter; import org.springframework.data.jdbc.core.convert.JdbcValue; import org.springframework.data.relational.core.mapping.WritingConverter; import java.sql.Types; import java.time.LocalDateTime; @WritingConverter public class LocalDateTimeToJdbcValueConverter implements Converter<LocalDateTime, JdbcValue> { @Override public JdbcValue convert(LocalDateTime source) { return JdbcValue.of(source, Types.TIMESTAMP); } }
- 注册转换器到 Spring Data JDBC 配置
import org.springframework.context.annotation.Configuration; import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration; import java.util.List; @Configuration public class JdbcConfig extends AbstractJdbcConfiguration { @Override protected List<?> userConverters() { return List.of(new LocalDateTimeToJdbcValueConverter()); } }
方案2:调整数据源连接参数(零代码修改)
在 PostgreSQL 连接 URL 中添加 stringtype=unspecified 参数,让驱动恢复旧版自动识别未知类型参数的逻辑:
spring: datasource: url: jdbc:postgresql://<数据库地址>/<数据库名>?stringtype=unspecified
方案3:单查询参数类型标注(仅需修改对应SQL)
在 @Query 中为时间参数添加 Spring Data JDBC 原生类型提示标记 ::timestamp,该标记会在参数绑定阶段指定类型,不属于SQL层面的CAST转换:
@Modifying @Query("UPDATE monitoring SET preview_start = :start_time::timestamp - interval '30 minutes', actual_start =:start_time::timestamp WHERE id= :id") Integer updateWith(@Param("id") String id, @Param("start_time") LocalDateTime startTime);
内容的提问来源于stack exchange,提问作者gmich
相关产品推荐
相关产品推荐

