前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
PS : mybatis 中也有對于 criteria?的使用,見另一文章:mybatis :Criteria 查詢、條件過濾用法
?
1. 業務場景:
(1) . 按業務條件查到所有數據后,要過濾掉其中 “當前領導自己填報的但不由自己審批的數據”?,本來我一直在想是不是會有和 sql 中類似于 except 效果的實現 ,就一直想找這個方法,但沒有點出這個方法來,直到在源碼中看到一個 not 方法 。
于是嘗試寫為:
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) .? 在微信端要求在一個輸入框中實現多種類型數據查詢。可輸入“姓名、項目名稱、工作任務、工作類型” 中的任意一種,并作相應條件過濾。
這種只給一個參數卻可能代表多種類型數據的實現 如下:
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. 最終實現:
@Overridepublic 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>() {@Overridepublic 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;}
?