【问题标题】:Adding interval to timestamp. Producing @Query in Repository interface将间隔添加到时间戳。在 Repository 接口中生成 @Query
【发布时间】:2020-12-17 08:24:07
【问题描述】:

数据库:Postgres, 编程技术:SpringBoot(Java 11)

我正在尝试创建@Query,但我实现它的方式 Hibernate 不会产生它,并且我得到了问题是间隔函数的异常。 我想根据 UserProps 在 modifiedAt 列中添加几天,然后决定 Db 是否应该选择它。我调用 Postgres INTERVAL 内部函数,但它似乎不起作用

  @Query ("select a job from Job job, Project proj, User u, Userprops props, where job.status LIKE 'CANCELED' AND job.project = proj.id AND \ n" +
             "proj.user = u.id AND props.user = u.id AND NOW () <job.modifiedAt + props.removeThingsAfterDays * FUNCTION ('INTERVAL' '1 day')")
     List <XTMJobEntity> getAllJobsThatShouldBeDeletedFromDbBasedOnUserProps ();

【问题讨论】:

    标签: java spring postgresql jpql


    【解决方案1】:

    在 Postgres 中 interval 不是函数,而是数据类型。即使是这样,您仍然不会使用 FUNCTION 作为关键字。在 Postgres 中,查询将是(保留过时的连接语法):

    select a job 
      from job job
         , project proj
         , user u
         , userprops props
     where job.status  = 'CANCELED' 
       and job.project = proj.id 
       and proj.user   = u.id 
       and props.user  = u.id 
       and now () <job.modifiedat + props.removethingsafterdays * '1 day'::interval;
    
    ---- OR 
        
    select a job                                                                    
       from job                                                                     
          , project proj                                                            
          , user u                                                                  
          , userprops props                                                         
      where job.status  = 'CANCELED'                                                
        and job.project = proj.id                                                   
        and proj.user   = u.id                                                      
        and props.user  = u.id                                                      
        and now () <job.modifiedat + props.removethingsafterdays * interval '1 day';
    

    注意:没有通配符(% 或 _)的 SQL 语句中的 LIKE 等效于等于运算符 (=)。

    所以也许你的查询字符串变成:

      @Query ("select a job from Job job, Project proj, User u, Userprops props, where job.status LIKE 'CANCELED' AND job.project = proj.id AND \ n" +
                 "proj.user = u.id AND props.user = u.id AND NOW () <job.modifiedAt + props.removeThingsAfterDays * INTERVAL '1 day'")
    

    【讨论】:

    • 感谢您的时间和关于“间隔”的解释。我会在星期一测试它,但我相信一切都会按预期工作
    • 糟糕,我本来打算添加以下内容。您可能想看看intervals,特别是第 8.5.4 和 8.5.5 节。
    • ErrorTracker.reportError::57 - 第 1:210 行:意外令牌:INTERVAL ||我会尝试使用原生 sql 查询
    • 我找到了解决方案。我将在下面的评论中添加对我有用的完整查询
    【解决方案2】:

    我的问题的答案是以下查询:

    @Query(value = "select job.* " +
           "from jobs job INNER JOIN projects proj ON job.project_id = proj.id INNER JOIN users u ON proj.user_id = u.id " +
           "INNER JOIN user_properties props ON props.user_id = u.id " +
           "where job.status = 'CANCELLED' " +
           "AND NOW() < job.modified_at + props.remove_cancelled_jobs_days * Interval '1days';", nativeQuery = true)
    

    【讨论】:

      猜你喜欢
      • 2021-03-18
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 2023-03-31
      • 1970-01-01
      • 2015-03-09
      • 2011-01-10
      相关资源
      最近更新 更多