【问题标题】:Select entity using between two offset times在两个偏移时间之间选择实体
【发布时间】:2021-03-23 22:57:57
【问题描述】:

在我的实体中,我有两个值 openTimecloseTime 类型均为 OffsetTime,现在我想检索当前时间在 openTime 和 closeTime 之间的实体,但我现在有什么问题如果openTime = '23:00:00'closeTime = '05:00:00',表示实体在晚上和夜间开放。 我有以下查询:

SELECT s FROM ShopArticle s LEFT JOIN FETCH s.openTimes t WHERE t.openTime < :time AND t.day = :day`

其中:time 的类型为OffsetTime:day 的类型为DayOfWeek。我无法将 openTime 更改为 DateTime 或其他,我该怎么做?

【问题讨论】:

    标签: spring hibernate jpa spring-data-jpa


    【解决方案1】:

    如果没有隔夜问题,where 子句的重要部分应该如下所示

    WHERE t.openTime <= :time 
    AND :time <= t.closeTime
    

    对于通宵问题,您需要类似的东西

    WHERE (
       t.openTime <= :time 
       AND :time <= t.closeTime
       AND t.day = :day
    )
    OR (
        (
            (t.openTime <= :time AND t.day = :day) 
        OR 
            (:time <= t.closeTime AND t.day = :day -1)
        )
        AND t.openTime > t.closeTime
    )
    

    但您不能在 JPQL 中进行日期计算,因此 :day -1 将不起作用。

    由于你好像用的是Spring Data JPA,所以可以解决that problem with a SpEL expression。如何做到这一点完全取决于您如何将:day 传递给查询。如果它实际上是一个类似日期的值,那么这个问题及其答案可能会有所帮助:How do I do date manipulation in SpEL?

    不幸的是,JPQL 并没有真正的方法来进行日期计算,这会派上用场,因为你必须做这样的事情:

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 2012-11-29
      • 2017-01-17
      • 2012-02-02
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      相关资源
      最近更新 更多