and和or组合重点代码:
List tempAnd = new ArrayList<>(); //临时查询条件and
List tempOr = new ArrayList<>(); //临时查询条件or
if (!StringUtils.isNullOrEmpty(user.getDeptId()) && user.getDeptId() != 0) {
//查询条件1:用户部门ID与查询的部门ID一致
tempOr.add(cb.equal(deptId, user.getDeptId()));
//查询条件2:用户名与查询用户名一致
tempOr.add(cb.equal(userName,user.getUserName));
}
//复杂查询:and和or的组合使用
//1.定义一个Predicate数组
Predicate[] array_and = new Predicate[tempAnd.size()];
//2.将and查询的条件添加到数组中
Predicate Pre_And = cb.and(tempAnd.toArray(array_and));
//3.再定义一个数组
Predicate[] arrayOr = new Predicate[tempOr.size()];
//4.将or查询的条件添加到数组中
Predicate Pre_Or = cb.or(tempOr.toArray(arrayOr));
//构建组合查询条件
query.where(Pre_And, Pre_Or);
return query.getRestriction();
In查询:需求查询用户deptId属于depts集合的数据
主要代码:
CriteriaBuilder.In in = cb.in(root.get("deptId").as(Long.class));
List
if (depts.size() > 0) {
depts.forEach(item -> in.value(item));
tempOr.add(cb.or(in)); }
CriteriaBuilder.In in = cb.in(root.get("deptId").as(Long.class));
//查询祖级列表中包含当前部门ID的部门ID集合
List depts = deptDao.selectDeptAncestorsList(user.getDeptId());
if (depts.size() > 0) {
//查询部门祖级列表包含当前查询用户部门Id的用户
depts.forEach(item -> in.value(item));
//查询条件:查询祖级列表中包括当前查询部门Id的用户
tempOr.add(cb.or(in));
}
//查询定义
Specification specification = new Specification() {
/**
* 构造断言
* @param root 实体对象引用
* @param query 规则查询对象
* @param cb 规则构建对象
*/
@Override
public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb) {
List predicates = new ArrayList<>();
List tempAnd = new ArrayList<>(); //临时查询条件and
List tempOr = new ArrayList<>(); //临时查询条件or
// 查询条件:1.用户姓名 2.用户电话 3.用户状态 4.创建时间范围
// 如果查询条件都为null则分页查询全部
if (StringUtils.isNullOrEmpty(user.getUserName())
&& StringUtils.isNullOrEmpty(user.getPhone())
&& StringUtils.isNullOrEmpty(user.getStatus())
&& StringUtils.isNullOrEmpty(user.getBeginTime())
&& StringUtils.isNullOrEmpty(user.getEndTime())
&& StringUtils.isNullOrEmpty(user.getDeptId())) {
//没有查询条件的时候直接查询全部
query.where(predicates.toArray(new Predicate[predicates.size()]));
//添加排序的条件语句
query.orderBy(cb.asc(root.get("createTime")));
return query.getRestriction();
} else {
//引用实体对象属性
Path userName = root.get("userName");
Path phone = root.get("phone");
Path status = root.get("status");
Path createTime = root.get("createTime");
Path deptId = root.get("deptId");
//查询条件不为空或者null时
if (!StringUtils.isNullOrEmpty(user.getUserName())) {
//添加条件:用户名的模糊查询
tempAnd.add(cb.like(userName, "%" + user.getUserName() + "%"));
}
if (!StringUtils.isNullOrEmpty(user.getPhone())) {
//添加条件:手机号与查询手机号一致
tempAnd.add(cb.equal(phone, user.getPhone()));
}
if (!StringUtils.isNullOrEmpty(user.getStatus())) {
tempAnd.add(cb.equal(status, user.getStatus()));
}
if (!StringUtils.isNullOrEmpty(user.getBeginTime())
&& !StringUtils.isNullOrEmpty(user.getEndTime())) {
tempAnd.add(cb.between(createTime, DateUtils.parseDate(user.getBeginTime()), DateUtils.parseDate(user.getEndTime())));
}
if (!StringUtils.isNullOrEmpty(user.getDeptId()) && user.getDeptId() != 0) {
CriteriaBuilder.In in = cb.in(root.get("deptId").as(Long.class));
//查询祖级列表中包含当前部门ID的部门ID集合
List depts = deptDao.selectDeptAncestorsList(user.getDeptId());
//查询条件1:部门ID与查询的部门ID一致
tempOr.add(cb.equal(deptId, user.getDeptId()));
if (depts.size() > 0) {
//查询部门祖级列表包含当前查询用户部门Id的用户
depts.forEach(item -> in.value(item));
//查询条件2:查询祖级列表中包括当前查询部门Id的用户
tempOr.add(cb.or(in));
}
}
//复杂查询:and和or的组合使用
Predicate[] array_and = new Predicate[tempAnd.size()]; //1.定义一个Predicate数组
Predicate Pre_And = cb.and(tempAnd.toArray(array_and)); //2.将and查询的条件添加到数组中
Predicate[] arrayOr = new Predicate[tempOr.size()];//3.再定义一个数组
Predicate Pre_Or = cb.or(tempOr.toArray(arrayOr)); //4.将or查询的条件添加到数组中
//构建组合查询条件
query.where(Pre_And, Pre_Or);
//添加排序的功能
query.orderBy(cb.asc(root.get("createTime")));
return query.getRestriction();
}
}
};
//分页信息
Pageable pageable = PageRequest.of(pageDomain.getPageNum() - 1, pageDomain.getPageSize()); //页码:前端从1开始,jpa从0开始,做个转换
//查询
return userDao.findAll(specification, pageable);