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

通过jdbcTemplate.query注入LocalDate到SQL查询出现PSQLException是什么原因

问题根因
  • PostgreSQL JDBC驱动对java.time包下类型(包括LocalDate)的自动映射,需要两个前提:驱动版本≥42.2.0,且运行时环境中存在对应类型转换的注册逻辑。你已经确认驱动版本一致,可排除该问题。
  • 最核心的诱因是IDE运行时类路径差异:虽然POM依赖声明一致,但新环境的IDE可能存在依赖冲突或依赖遗漏,比如Spring框架中负责JSR-310(java.time规范)类型转换的Jsr310JdbcTypeConverter没有被自动注册到上下文中。
  • 次要排查点:连接池配置差异,如果项目使用了Druid、HikariCP等连接池,旧环境可能配置了jdbcTypeForNull或自定义类型转换器,新环境的运行配置没有同步该部分参数。
  • 特殊场景:如果你使用的Spring版本<4.3,框架本身没有内置对JSR-310类型的JDBC参数转换支持,旧环境可能手动注册了全局转换器,新环境没有同步该配置。
符合规范的解决方案
  • 方案1:显式指定参数类型(最稳妥,无侵入)
    调用jdbcTemplate时显式传入参数对应的SQL类型,不需要修改其他配置:
jdbcTemplate.query(QUERY, new Object[]{date}, new int[]{Types.DATE});

也可以使用带参数类型指定的重载方法:

jdbcTemplate.query(QUERY, date, Types.DATE);
  • 方案2:注册全局JSR-310 JDBC类型转换器
    如果是Spring环境,手动注册转换器到JdbcTemplate的类型转换器中,一劳永逸:
// 配置类中添加
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.setTypeConverter(new DefaultTypeConverter(
        ConversionServiceFactory.createDefaultConversionService()
    ));
    return jdbcTemplate;
}
  • 方案3:修复IDE类路径一致性
    在新环境IDE中执行mvn dependency:tree(Maven)或gradle dependencies(Gradle),对比新旧环境的依赖树,排除冲突的JDBC相关依赖、补充缺失的spring-jdbc或spring-context依赖,保证运行时类路径完全一致。

内容的提问来源于stack exchange,提问作者Ilyas Saitov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:36:04