PS : mybatis 中也有对于 criteria 的使用,见另一文章:mybatis :Criteria 查询、条件过滤用法
1. 业务场景:
(1) . 按业务条件查到所有数据后,要过滤掉其中 “当前领导自己填报的但不由自己审批的数据” ,本来我一直在想是不是会有和 sql 中类似于 except 效果的实现 ,就一直想找这个方法,但没有点出这个方法来,直到在源码中看到一个 not 方法 。
于是尝试写为:
代码语言:javascript复制Predicate a = cb.notEqual(root.get("approverId"), uid); // 非他审批
Predicate b = cb.equal(root.get("employeeId"), uid); // 他填报
list.add(cb.and(a, b).not()); 这样可以得到 cb.and(a, b) 结果的反集,实现去除效果。
(2) . 在微信端要求在一个输入框中实现多种类型数据查询。可输入“姓名、项目名称、工作任务、工作类型” 中的任意一种,并作相应条件过滤。
这种只给一个参数却可能代表多种类型数据的实现 如下:
代码语言:javascript复制 Predicate p = cb.or(cb.like(root.get("employeeName"), "%" search "%"));
p = cb.or(p, cb.like(root.get("busName"), "%" search "%"));
p = cb.or(p, cb.like(root.get("projectName"), "%" search "%"));
p = cb.or(p, cb.like(root.get("jobTypeName"), "%" search "%"));
list.add(p);
2. 最终实现:
代码语言:javascript复制 @Override
public Object findByPage(Pageable pageable, final String employeeId, final String employeeName, String beginDate, String endDate,
final String departmentId, final Integer status, final String processInstanceId,
final String approveId, final String jobTypeId,
final String projectId, final String busId, final String search, final String uid) {
Page<WorkWeight> page = workWeightRepository.findAll(new Specification<WorkWeight>() {
@Override
public Predicate toPredicate(Root<WorkWeight> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> list = Lists.newArrayList();
//构造条件
list.add(cb.equal(root.get("delFlag"), "0"));
// 参数 search 可代表姓名、项目名称、工作任务、工作类型中的任意一种
if (StringUtils.isNotEmpty(search)) {
Predicate p = cb.or(cb.like(root.get("employeeName"), "%" search "%"));
p = cb.or(p, cb.like(root.get("busName"), "%" search "%"));
p = cb.or(p, cb.like(root.get("projectName"), "%" search "%"));
p = cb.or(p, cb.like(root.get("jobTypeName"), "%" search "%"));
list.add(p);
}
// 去掉当前领导自己填报的但不由自己审批的数据。
if (StringUtils.isNotEmpty(uid)) {
Predicate a = cb.notEqual(root.get("approverId"), uid); // 非他审批
Predicate b = cb.equal(root.get("employeeId"), uid);// 他填报
list.add(cb.and(a, b).not()); // not 指取反,A && B 等价于 !A || !B
}
Predicate[] p = new Predicate[list.size()];
return cb.and(list.toArray(p));
}
}, new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), pageable.getSort()));
return page;
}