通过 jdbcTemplate.query 将 Date 或 LocalDate 注入 SQL 查询?

Inject Date or LocalDate into SQL query via jdbcTemplate.query?

我有一个简单的查询:

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 依赖性相同。

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 及其子项已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*.


* 如果您正在为 Android 项目工作并且您的 Android API 水平仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring. Note that Android 8.0 Oreo already provides support for java.time