/**
* 实现分页带条件查询
* Page的泛型为要查询记录的对象
* @param map 存储条件
* 比如:companyId 公司id
* departmentId 部门id
* @param page 页码
* @param size 每页显示的记录条数
* @return 返回的是page对象
*/
public Page<User> findRecordsByCondition(Map<String,Object> map, int page, int size){
//查询条件,使用Specification,泛型为要查询的类
Specification<User> spec = new Specification<User>() {
/**
* 动态拼接查询条件
* @param root 代表Criteria查询的根对象
* @param query 代表一个specific的顶层查询对象,它包含着查询的各个部分,比如:select 、from、where、group by、order by
* @param cb 用来构建CritiaQuery的构建器对象
* @return
*/
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
//用来封装多个查询条件
List<Predicate> list = new ArrayList<>();
//1.根据请求的companyId是否为空构造查询条件,这里用StringUtils类来判断字段是否为空
if (!StringUtils.isEmpty(map.get("companyId"))){
list.add(cb.equal(root.get("companyId").as(String.class) , (String)map.get("companyId")));
}
//根据请求的部门id构造查询条件
if (!StringUtils.isEmpty(map.get("departmentId"))){
list.add(cb.equal(root.get("departmentId").as(String.class) , (String)map.get("departmentId")));
}
return cb.and(list.toArray(new Predicate[0]));
}
};
//分页
return userDao.findAll(spec, PageRequest.of(page - 1, size));
}
jpa实现带条件分页查询
最新推荐文章于 2024-05-06 18:26:10 发布