Postgres时间间隔在使用本地Spring Data JPA查询时无法工作

9

我创建了一个带有时间间隔的本地查询。当我在查询中硬编码 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)

我遇到了这个错误:
Caused by: org.postgresql.util.PSQLException: ERROR: 在"$1"附近有语法错误
2个回答

19

你不能直接提供那样一个间隔的数值。你需要将参数值乘以你的间隔基本单位:

"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 => ...是函数调用的一个命名参数。如果变量代表小时数,您可以使用make_interval(hours => ..)


感谢您的帮助。 - Ajit Soman
你的意思是 (interval '1' hour) * :hours 吗? - Mike Quoro
1
不错,在查询注释中可以使用,但在公式注释中无法使用。因此,我最终使用了 make_interval(0,0,0,1) 来指定一个1天的间隔。 - Philippe
ERROR: function make_interval(days => character varying) does not exist - DragonKnight
你需要传递数字,而不是字符串。 - user330315
显示剩余3条评论

6
这篇文章提供了一种解决方案:Spring Boot中使用nativeQuery的查询注释在PostgreSQL中无法工作 基本上:
@Query(value="select * from orders where created_date  < clock_timestamp() - ( :toTime )\\:\\:interval",nativeQuery=true)

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


这就是解决我的问题的方法 - 转义双冒号,因为JPA将其解释为替换变量。 - Phillip
这在查询注释中有效,但在公式注释中无效。在公式注释中,我最终将其编写为 make_interval(0,0,0,1) 以指定1天间隔。 - Philippe
@sergio,你能告诉我如何在查询注释中正确传递我的SQL吗:DELETE FROM TABLE WHERE my_column < (NOW() - INTERVAL '30 minutes'),我想在我的Java方法中将“30分钟”作为参数传递。 - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接