Duang,最近搭建了一个自己的博客小破站,欢迎各位小伙伴来访吖:
ares-coder-blog-portalhttps://www.ares-stack.cn/blog_service/#/game
问题:
动态查询需要判断参数是否为 null ,在repository里的那样的写法,在网上并没找到真正适用的写法。
package com......pubcascade.repository.dao;
简述:
Spring Data JPA虽然大大的简化了持久层的开发,但是在实际开发中,很多地方都需要高级动态查询。
使用@Query注解,这种方式可以直接在Repository里面写sql,但是这种方式的问题就是太麻烦了,而且非常容易出错,扩展性也很差,还不如直接用mybatis。
复杂的查询还是使用其他的方式更好(Example、Criteria、SpringBoot中的findAll(filterList, sort) 等等)。
解决:
暂时只能使用重载,写两个方法,在业务实现类层调用不同的方法
- 一个带where条件 在参数不为空的时候调用;
- 另一个不带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<Customer> findDate(@Param("name") String name);
参考来源:
https://bbs.csdn.net/topics/390968657/