我试图在我的存储库中编写一个类似于这个的查询方法
@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(( 与显式 Types 值一起使用以指定要使用的类型。
我是否忘记了什么,或者Spring Data Jdbc根本不支持将Instant用作参数?如果是这样,将来是否计划提供这种支持?
对于那些来到这里寻找解决方案以优于毫秒精度生成java.sql.Timestamp
实例的人(Timestamp
接受纳米的构造函数已被弃用(:
Timestamp timestamp = Timestamp.from(Instant.now());
这假定您的操作系统支持优于毫秒的系统时钟精度。 它对于支持优于毫秒的时间戳精度的数据库很有用,例如支持微秒精度的 PostgreSQL。
您可以将其转换回Instant
或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
,正如斯托蒂指出的那样。
Spring Data JDBC不知道SQL语句所期望的类型。因此,它会在没有任何转换的情况下长时间传递参数,并依靠数据库来正确处理参数。
有人可能会争辩说,如果注册了匹配的转换器,它应该转换参数,但目前情况并非如此。
因此,目前的解决方案是自己转换参数并将参数类型更改为java.util.Date
或 JDBC 驱动程序接受的任何内容。