Spring Data JPA查询:参数非空时校验存在性,不存在返回空列表
解决方法
直接修改JPQL查询语句,嵌入存在性校验逻辑,同时保留原有的参数匹配规则:
@Query("SELECT c FROM Customer c " + "WHERE (:name IS NULL OR EXISTS(SELECT 1 FROM Customer c2 WHERE c2.name = :name)) " + "AND (:email IS NULL OR EXISTS(SELECT 1 FROM Customer c3 WHERE c3.email = :email)) " + "AND (:name IS NULL OR c.name = :name) " + "AND (:email IS NULL OR c.email = :email)") List<Customer> findCustomerByNameAndEmail(@Param("name") String name, @Param("email") String email);
逻辑解释
- 对
name参数:如果传入非空值,先通过EXISTS子查询验证数据库中是否存在该名称的客户,不存在则整个查询条件不成立,直接返回空列表;参数为空时跳过该校验。 - 对
email参数:校验逻辑和name完全相同。 - 最后保留原有的筛选逻辑,获取符合传入参数条件的客户记录。
这种方式完全通过查询语句实现需求,不需要额外的业务层判断。
内容的提问来源于stack exchange,提问作者SpicySandwich
相关产品推荐
相关产品推荐

