【问题标题】:How to handle null values in an HQL query when checking a list for a contained integer value检查包含整数值的列表时如何处理 HQL 查询中的空值
【发布时间】:2020-02-02 14:06:16
【问题描述】:

我有一个 Spring Boot 存储库,我尝试在其中使用 HQL 创建一个查询函数。

该函数接受一个整数参数,如果它为空,则查询应忽略该参数,否则应检查列表是否包含该值。

我将 where 子句分为两部分,空值检查和列表检查,如下所示:

@Query("SELECT u FROM MyEntity " +
" WHERE (:myParam is null or :myParam in (2, 3))"
)

现在的问题是,对于 :myParam in (2, 3) 部分,它抱怨“不一致的数据类型:预期的 BINARY 得到了 NUMBER

(当 :myParam 为 null 时,对于 :myParam != null 有效)

我试过了:

  • 将参数或空值转换为 in

  • 使用 coalesce(:myParam, CAST(NULL AS int)) 解决了 :myParam 是整数列表的类似问题

  • 使用 switch case 语句

(case when :spracheKy is null then true when :spracheKy in (2, 3) then true else false end) = true

提前感谢您的帮助

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    为什么不直接使用两种不同的存储库方法,例如一个不带参数的方法和另一个带参数的方法。然后决定并将决策逻辑封装在服务层的单独方法中 - 我的意思是根据参数是否为空来调用哪个存储库方法的逻辑......可能如下所示:

    @Service
    @Transactional
    public class YourService {
    
        // autowired by constructor injection
        private final YourEntityRepository repo;
    
        public List<YourEntity> getAllYourEntitiesByParam(Long param) {
            if (param == null) {
                return repo.findAll();
            }
            return repo.findAllByParam(param);
        }
    }
    

    【讨论】:

    • 嗨,感谢您的回复 :) 问题是我有一个相对复杂的 api,它有大约 50 个过滤条件,一个整数值只是其中之一。我认为最容易做的事情是进行一个查询,每个参数一行一行,以使事情至少有一半的可读性/可维护性。过滤条件类似于 - 可能 id 列表中的实体 id - 实体列表包含特定值(这是问题所在) - 实体内的日期大于/小于/等于参数 ... etcpp
    • @Felix 好的,我明白了。只是从阅读您的回答我想知道 Hibernate/JPA 的 Criteria API 是否更适合...baeldung.com/spring-data-criteria-queries
    猜你喜欢
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多