通过 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));
但我觉得不对:我想知道原因。
到目前为止我检查了什么:
- PostgreSQL 版本相同(顺便说一句,尝试升级到 14)
- JDK版本相同
- 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
。
我有一个简单的查询:
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));
但我觉得不对:我想知道原因。 到目前为止我检查了什么:
- PostgreSQL 版本相同(顺便说一句,尝试升级到 14)
- JDK版本相同
- 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
。