You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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,恢复旧版绑定逻辑:

  1. 实现转换器类
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);
    }
}
  1. 注册转换器到 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 15:45:05