我有一个简单的查询:
select * from sometable where date = ?
我在查询中注入了一个LocalDate:
jdbcTemplate.query(QUERY, date);
一切正常。在我我的IDE项目移动到另一个电脑,没有任何改变,它开始抛出例外:
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版本相同(BTW尝试升级到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
Date-Time API及其子API过时且容易出错。建议完全停止使用它们,切换到现代的Date-Time API*。
*如果你正在为一个Android项目工作,你的Android API级别仍然不兼容Java-8,检查Java 8+可用的API。注意,Android 8.0 Oreo已经提供了对java.time
的支持。