首页 > 解决方案 > 通过 jdbcTemplate.query 将 Date 或 LocalDate 注入 SQL 查询?

问题描述

我有一个简单的查询,例如:

select * from sometable where date = ?

我将 LocalDate 注入到查询中:

jdbcTemplate.query(QUERY, date);

一切正常。在我使用 IDE 将我的项目移动到另一台 PC 后,没有任何更改,它开始抛出异常:

nested exception is org.postgresql.util.PSQLException: 
Can't infer the SQL type to use for an instance of java.time.LocalDate. 
Use setObject() with an explicit Types value to specify the type to use.

我可以通过将 LocalDate 转换为 Date 来使用解决方法:

jdbcTemplate.query(QUERY, java.sql.Date.valueOf(date));

但这对我来说似乎不对:我想知道原因。到目前为止我检查的内容:

  1. PostgreSQL 版本相同(顺便说一句尝试升级到 14)
  2. JDK版本相同
  3. PostgreSQL 的 POM 依赖项是相同的。

标签: javasqlpostgresqljava-time

解决方案


java.time.LocalDate从 Java-8 开始就可以使用,而您的 JDBC 驱动程序基于 Java-7,因此存在问题。将 JDBC 驱动程序升级到最新的(以下)或至少支持最低 Java-8 的驱动程序。

<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.24</version>
</dependency>

注意:日期java.util时间 API 及其子 API 已过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *


* 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring 检查可用的 Java 8+ API。请注意,Android 8.0 Oreo 已经提供java.time.


推荐阅读