首页 > 解决方案 > 使用 Spring Data JDBC 中不支持的类型的查询参数?

问题描述

我试图在我的存储库中编写一个类似于此的查询方法

@Modifying
@Query("UPDATE foo SET some_timestamp = :someTimestamp WHERE id = :id")
void updateSomeTimestamp(@Param("id") long id, @Param("someTimestamp") Instant someTimestamp)

执行代码时出现以下错误:

org.postgresql.util.PSQLException:无法推断要用于 java.time.Instant 实例的 SQL 类型。使用带有显式类型值的 setObject() 来指定要使用的类型。

我是否忘记了什么,或者 Spring Data Jdbc 根本不支持将 Instant 用作参数?如果是这样,将来是否计划提供这样的支持?

标签: javaspringtype-conversionspring-dataspring-data-jdbc

解决方案


对于那些来这里寻找解决方案以生成java.sql.Timestamp优于毫秒精度的实例的人(Timestamp不推荐使用接受 nanos 的构造函数):

Timestamp timestamp = Timestamp.from(Instant.now());

这假设您的操作系统支持优于毫秒的系统时钟精度。它对于支持优于毫秒 TIMESTAMP 精度的数据库很有用,例如支持微秒精度的 PostgreSQL。

您可以将其转换回Instantor LocalDateTime

System.out.println(timestamp.toInstant()); // UTC

或者

System.out.println(timestamp.toLocalDateTime()); // local time

我还将重申 stoetti 在评论中提供的信息,根据 stoetti 提供的文档链接 https://jdbc.postgresql.org/documentation/head/8-date-time.html,PostgreSQL JDBC 驱动程序确实识别以下java.time类作为时间戳:

java.time.LocalTime作为TIME [ WITHOUT TIMEZONE ]

java.time.LocalDateTime作为TIMESTAMP [ WITHOUT TIMEZONE ]

java.time.OffsetDateTime作为TIMESTAMP WITH TIMEZONE

但不是java.time.Instant,正如 stoetti 指出的那样。


推荐阅读