使用春季数据 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(( 与显式 Types 值一起使用以指定要使用的类型。

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

对于那些来到这里寻找解决方案以优于毫秒精度生成java.sql.Timestamp实例的人(Timestamp接受纳米的构造函数已被弃用(:

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

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

您可以将其转换回InstantLocalDateTime

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.LocalTimeTIME [ WITHOUT TIMEZONE ]

java.time.LocalDateTimeTIMESTAMP [ WITHOUT TIMEZONE ]

java.time.OffsetDateTimeTIMESTAMP WITH TIMEZONE

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

Spring Data JDBC不知道SQL语句所期望的类型。因此,它会在没有任何转换的情况下长时间传递参数,并依靠数据库来正确处理参数。

有人可能会争辩说,如果注册了匹配的转换器,它应该转换参数,但目前情况并非如此。

因此,目前的解决方案是自己转换参数并将参数类型更改为java.util.Date或 JDBC 驱动程序接受的任何内容。

最新更新