Postgres Interval 不适用于本机 Spring 数据 JPA 查询

Posted

技术标签:

【中文标题】Postgres Interval 不适用于本机 Spring 数据 JPA 查询【英文标题】:Postgres Interval not working with native spring data JPA query 【发布时间】:2017-10-01 17:05:56 【问题描述】:

我创建了一个带间隔的本机查询。当我在查询中硬编码day 时,查询工作正常:

@Query(value="select * from orders where created_date  < clock_timestamp() - interval ' 5 days'",nativeQuery=true)

但是当我像这样使用@Param 提供数据时:

@Query(value="select * from orders where created_date  < clock_timestamp() - interval :day 'days'",nativeQuery=true)
List<Order> getData(@Param("day") String day)

我收到了这个错误:

原因:org.postgresql.util.PSQLException: ERROR: syntax error at 或“$1”附近

【问题讨论】:

【参考方案1】:

您不能为这样的间隔提供值。您需要将参数值与间隔基本单位相乘:

"select * from orders 
where created_date  < clock_timestamp() - (interval '1' day) * :days"

当您处理日子时,您可以将其简化为:

"select * from orders 
where created_date  < clock_timestamp() - :days"

另一个选项是make_interval() 函数。您可以为不同的单位传递多个参数。

"select * from orders 
where created_date  < clock_timestamp() - make_interval(days => :days)"

符号days =&gt; ... 是函数调用的命名参数。如果变量代表小时,你可以使用make_interval(hours =&gt; ..)

【讨论】:

感谢您的帮助 interval '2 hour'... 呢? 你的意思是(interval '1' hour) * :hours 我尝试了(interval '1 hour') * :hours,但我的结果是不正确的,虽然已经没有异常了。 ***.com/questions/57795441/… 很好,适用于查询注释,但不适用于公式注释。在那里,我最终让make_interval(0,0,0,1) 指定了 1 天的间隔。【参考方案2】:

本条目提供了一个解决方案Spring Boot Query annotation with nativeQuery doesn't work in Postgresql

基本上:

@Query(value="select * from orders where created_date  < clock_timestamp() - ( :toTime )\\:\\:interval",nativeQuery=true)

'toTime' 是您存储库中的一个参数,可以是天、小时、分钟...等(Postgres 中的审查间隔文档)@Param("toTime") String toTime

【讨论】:

这就是解决我的问题的方法 - 转义双冒号,因为 JPA 将其解释为替换变量 这适用于查询注释,但不适用于公式注释。在公式注释中,我最终将其写为 make_interval(0,0,0,1) 以指定 1 天的间隔。

以上是关于Postgres Interval 不适用于本机 Spring 数据 JPA 查询的主要内容,如果未能解决你的问题,请参考以下文章

索引扫描不适用于 postgres 中的 json 数据集

为啥 django test --keep-db 适用于 postgres 数据库但不适用于默认 sqlite3

JPA batch_size 属性不适用于本机查询

android facebook登录不适用于安装的本机facebook

React 本机通知图标不适用于三星

本机 Javascript 单击事件不适用于按钮中的图标