java - 有没有更简单的方法来使用 BETWEEN 进行 JPQL 查询以在属性中包含 NULL 值

标签 java jpa jpql

我有一个 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”为 null 且“periodTo”为 null 时,应找到条目。

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

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

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

    @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);

最佳答案

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

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

关于java - 有没有更简单的方法来使用 BETWEEN 进行 JPQL 查询以在属性中包含 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57627607/

相关文章:

list - JPQL 结合 IN 和 LIKE

jpa - jpql - 在一对多集合中选择一些元素

java - 从 windows 目录和 scp 中获取最新文件到 linux 服务器

java - JPA获取数据时的多对一持久性问题

java - hibernate 多模式映射

java - 如何在不使用 JOIN 的情况下为 JPQL 中的 Collection 子句执行参数绑定(bind)?

java - 如何更改android 3.0 + 版本主题中的默认分隔(划分)?

java - 如何在 Jackson JSON(反)序列化中使用自定义键类型自定义序列化或转换 Map 属性?

java - 二进制字符串到整数转换器中的错误

java - 间接插入命名表?