【问题标题】:Postgres Interval not working with native spring data JPA queryPostgres Interval 不适用于本机 Spring 数据 JPA 查询
【发布时间】: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”附近

【问题讨论】:

    标签: java postgresql spring-data-jpa


    【解决方案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,但我的结果是不正确的,虽然已经没有异常了。 stackoverflow.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 天的间隔。
    猜你喜欢
    • 2021-01-19
    • 2020-12-15
    • 2018-12-16
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2018-02-22
    • 2013-07-17
    相关资源
    最近更新 更多