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 => ...
是函数调用的命名参数。如果变量代表小时,你可以使用make_interval(hours => ..)
【讨论】:
感谢您的帮助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 查询的主要内容,如果未能解决你的问题,请参考以下文章
为啥 django test --keep-db 适用于 postgres 数据库但不适用于默认 sqlite3