java - 通过 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));
但这对我来说似乎不对:我想知道原因。到目前为止我检查的内容:
- 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 及其子 API 已过时且容易出错。建议完全停止使用它们并切换到现代 Date-Time API *。
* 如果您正在为一个 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring 检查可用的 Java 8+ API。请注意,Android 8.0 Oreo 已经提供对java.time
.
推荐阅读
- numpy - 当某些数据丢失时,NumPy 如何重塑?
- perl - Perl Mojolicious 路由只调用一次 sub
- double - QLCD数字显示双
- rust - Rust 代码可以在没有标准库的情况下编译吗?
- r - 重叠线图的图例
- websocket - websocket和vertx的区别
- python - 如果 QuerySet = [ ] 在 html 中显示 '0'
- machine-learning - 在 Sklearn 中使用 Pipeline 时如何进行数据集平衡?
- python - “没有足够的值来解包(预期 2,得到 1)”是什么意思?
- prometheus - Traefik 2 与 Prometheus 和 Grafana