简体   繁体   中英

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

I had a simple query like:

select * from sometable where date = ?

I injected a LocalDate into query:

jdbcTemplate.query(QUERY, date);

Everything worked fine. After I moved my project with IDE to another PC, without any alterations, it started to throw exception:

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.

I can use a workaround via converting LocalDate to Date:

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

but it does not seem right to me: I want to know the reason. What I checked so far:

  1. PostgreSQL version is the same (BTW tried upgrading to 14)
  2. JDK version is the same
  3. POM dependency for PostgreSQL is the same.

java.time.LocalDate has been available since Java-8 whereas your JDBC driver is based on Java-7, and hence the problem. Upgrade the JDBC driver to the latest one (following) or at least to the one supporting minimum Java-8.

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

Note: The java.util Date-Time API and its children are outdated and error-prone. It is recommended to stop using them completely and switch to the modern Date-Time API * .


* If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring . Note that Android 8.0 Oreo already provides support for java.time .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM