java - 使用 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 用作参数?如果是这样,将来是否计划提供这样的支持?
解决方案
对于那些来这里寻找解决方案以生成java.sql.Timestamp
优于毫秒精度的实例的人(Timestamp
不推荐使用接受 nanos 的构造函数):
Timestamp timestamp = Timestamp.from(Instant.now());
这假设您的操作系统支持优于毫秒的系统时钟精度。它对于支持优于毫秒 TIMESTAMP 精度的数据库很有用,例如支持微秒精度的 PostgreSQL。
您可以将其转换回Instant
or 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 指出的那样。
推荐阅读
- kotlin - 我可以将构建器模式与 lambda 表达式结合起来吗?
- c++ - 在文件中查找并提取某个值
- python-3.x - Shifting x axis in dataframe.plot() : Python
- java - 如何在没有 web.xml 的情况下应用 ContainerRequestFilter?
- c++ - Cesanta Mongoose - 连接到本地主机时出现问题
- python - 如何根据其他列的内容选择数据框中的特定数据?
- c# - 从 ASP.NET mvc 中的数组下拉列表
- ruby - 如何将哈希值传递到注册表单中的字段?
- c# - 尝试在不更改文件大小的情况下更改图像 DPI
- javascript - 了解返回映射子组件的 React 功能组件