Spring Data JPA 中Repository里的方法查询参数,需要判断是否为空的问题

问题:

动态查询需要判断参数是否为 null ,在repository里的那样的写法,在网上并没找到真正适用的写法。

package com......pubcascade.repository.dao;

简述:

Spring Data JPA虽然大大的简化了持久层的开发,但是在实际开发中,很多地方都需要高级动态查询。

使用@Query注解,这种方式可以直接在Repository里面写sql,但是这种方式的问题就是太麻烦了,而且非常容易出错,扩展性也很差,还不如直接用mybatis。

复杂的查询还是使用其他的方式更好(Example、Criteria、SpringBoot中的findAll(filterList, sort) 等等)。


解决:

暂时只能使用重载,写两个方法,在业务实现类层调用不同的方法

  1. 一个带where条件 在参数不为空的时候调用;
  2. 另一个不带where条件,在参数为空的时候调用。
    /**
     * 验证第一层级的名称唯一(新增时)
     * @param
     * @return
     */
    @Query("select p from PubCascade p where p.linkName = :linkName and p.level = 1 and p.deleted = false")
    PubCascade validateFirstLevel(@Param("linkName") String linkName);

    /**
     * 验证第一层级的名称唯一(编辑时)
     * @param
     * @return
     */
    @Query("select p from PubCascade p where p.linkName = :linkName and p.level = 1 and p.deleted = false and p.id <> :id")
    PubCascade validateFirstLevel(@Param("linkName") String linkName,@Param("id") Long id);

网上找到的一种写法(未实践):

可以试一试这里的两种方法:

(1)@Query( value = "SELECT * FROM sys_customer WHERE 1=1 " +
            " AND if(:name!='',name LIKE CONCAT('%',:name,'%'),1=1)",
            nativeQuery = true)

(2)@Query(value = "SELECT * FROM sys_customer WHERE 1=1 "+
            " AND (name LIKE CONCAT('%',:name,'%') OR :name IS NULL )",
            nativeQuery = true)
    List findDate(@Param("name") String name);

 


参考来源:

https://bbs.csdn.net/topics/390968657/

https://blog.csdn.net/billluffy/article/details/83147538

https://www.jianshu.com/p/0939cec7e207

你可能感兴趣的:(------【Spring,Data,JPA】)