【问题标题】:Is there an easier way to make a JPQL query with BETWEEN to include NULL values in properties是否有一种更简单的方法可以使用 BETWEEN 进行 JPQL 查询以在属性中包含 NULL 值
【发布时间】:2019-08-23 13:41:57
【问题描述】:

我有一个 JPQL 查询

    @Query("SELECT e FROM Entry e WHERE :chosenDate BETWEEN e.periodFrom AND e.periodTo")
    List<Entry> findByChosenDate(LocalDate chosenDate);

存在一个问题,即当“periodFrom”或“periodTo”属性之一未设置时,条目将不会被选中。我希望查询还包括具有一两个 NULL 值的整体。

我希望查询在另外三种情况下选择条目:

  1. 当“periodFrom”为空且“periodTo”为空时,应找到该条目。

  2. 当“periodFrom”为空且“periodTo”>=:chosenDate 时,应找到该条目。

  3. 当 "periodFrom"

有没有比这样的查询更简单的方法:

    @Query("SELECT e FROM Entry e WHERE (:chosenDate BETWEEN e.periodFrom AND e.periodTo) 
        OR (e.periodFrom IS NULL AND e.periodTo IS NULL )
        OR ( e.periodFrom <= :chosenDate AND e.periodTo IS NULL)
        OR (e.periodFrom IS NULL AND e.periodTo >= :chosenDate)") 
    List<Entry> findByChosenDate(LocalDate chosenDate);

【问题讨论】:

  • 您是否考虑过为查询提供一些默认值,以便它永远不会直接处理 NULL 值? COALESCE 将日期设置为合理的默认值,以便它们仍然满足您的标准
  • 我没有考虑过提供默认值,但我会考虑的。是的,使用 COALESCE 可以缩短查询时间。

标签: java jpa jpql


【解决方案1】:

我不知道你是否觉得它更好,但这样的东西会更短:

SELECT e FROM Entry e WHERE (:chosenDate BETWEEN COALESCE(e.periodFrom, 0000-01-01) AND COALESCE(e.periodTo, 9999-12-31) 

【讨论】:

  • 根据数据库,您可能需要使用0001-01-01 作为日期下限。
猜你喜欢
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多