当前位置: 首页 > 知识库问答 >
问题:

使用Spring数据JDBC中不支持的类型的查询参数?

司寇星海
2023-03-14

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

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

在执行代码时,我遇到了以下错误:

组织。postgresql。util。PSQLException:无法推断用于java实例的SQL类型。时间瞬间使用带有显式类型值的setObject()指定要使用的类型。

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

共有2个答案

海叶秋
2023-03-14

Spring Data JDBC不知道SQL语句所期望的类型。因此,它传递参数很长时间而不进行任何转换,并依赖数据库来正确处理参数。

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

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

皮嘉德
2023-03-14

对于那些来这里寻找生成java的解决方案的人。sql。时间戳精度优于毫秒的实例(不推荐接受Nano的时间戳构造函数):

Timestamp Timestamp=时间戳。从(瞬间。现在())

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

您可以将其转换回InstantLocalDateTime

系统。出来println(timestamp.toInstant());//UTC

System.out.println(timestamp.toLocalDateTime()); // 本地时间

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

java.time.LocalTime作为time[没有TIMEZONE]

java。时间LocalDateTimeasTIMESTAMP[无时区]

java。时间OffsetDateTime作为带有时区的时间戳

但不是java。时间正如斯托蒂所指出的,即时的

 类似资料:
  • 问题内容: 当使用各种JDBC模板方法之一时,我对如何迭代/滚动大结果集(不适合内存)感到困惑。即使没有直接公开Iterable接口,我至少也希望RowQuerybackHandler实例在查询执行后( 而 不是在堆溢出之后)执行时被调用。 我也有在看一个这个(这什么都没有改变,我尽管是在精神上类似这个帖子上的堆栈溢出),并在该岗位在spring论坛。后者似乎暗示在游标获取数据时确实应该调用回调处

  • 谷歌云SQL提供的所有数据类型是什么? 我正在迁移一个数据库,所以我想知道谷歌云支持的数据类型。如果有任何官方链接,请提供。

  • 我想让我的查询参数类是不可变的(通过构造函数设置公共final字段)。有没有一种方法可以通过构造函数强制SearchQueryParam实例的创建,并且不公开可怕的getters/setter? 下面是工作的示例代码: 但我希望我的SearchQueryParam类更像这样:

  • 我在springdatajpa中执行更新查询时遇到问题。这是存储库层中的代码: 如您所见,我已经添加了@修改注释,但它仍然抛出“不支持DML操作”的错误,我正在使用Hibernate 5.4。非常感谢任何帮助。

  • 我正在用spring数据创建一个带有空日期检查的spel动态查询。我的疑问是: 当我使用有效日期运行此查询时,它可以工作,但当我传递空日期时,我会得到以下错误: 堆栈跟踪:

  • 我正在尝试使用 python 快速 API 框架代理外部网站(在不同容器上运行的花卉监控 URL): 它能够为每个路径代理容器URL。为了前任。 http://python_server:8001/monitor/dashboard -- 超文本传输协议://python_server: 8001/监视器/任务-- 它工作得很好。但是当PATH在URL中有一些查询参数时,它会失败。 为了前任。 (