jpa : criteria 作排除过滤、条件中除去查出的部分数据、JPA 一个参数可查询多个字段
生活随笔
收集整理的這篇文章主要介紹了
jpa : criteria 作排除过滤、条件中除去查出的部分数据、JPA 一个参数可查询多个字段
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點擊跳轉(zhuǎn)到教程。
PS : mybatis 中也有對于 criteria?的使用,見另一文章:mybatis :Criteria 查詢、條件過濾用法
?
1. 業(yè)務(wù)場景:
(1) . 按業(yè)務(wù)條件查到所有數(shù)據(jù)后,要過濾掉其中 “當(dāng)前領(lǐng)導(dǎo)自己填報的但不由自己審批的數(shù)據(jù)”?,本來我一直在想是不是會有和 sql 中類似于 except 效果的實現(xiàn) ,就一直想找這個方法,但沒有點出這個方法來,直到在源碼中看到一個 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) 結(jié)果的反集,實現(xiàn)去除效果。(2) .? 在微信端要求在一個輸入框中實現(xiàn)多種類型數(shù)據(jù)查詢??奢斎搿靶彰㈨椖棵Q、工作任務(wù)、工作類型” 中的任意一種,并作相應(yīng)條件過濾。
這種只給一個參數(shù)卻可能代表多種類型數(shù)據(jù)的實現(xiàn) 如下:
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. 最終實現(xiàn):
@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();//構(gòu)造條件list.add(cb.equal(root.get("delFlag"), "0"));// 參數(shù) search 可代表姓名、項目名稱、工作任務(wù)、工作類型中的任意一種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);}// 去掉當(dāng)前領(lǐng)導(dǎo)自己填報的但不由自己審批的數(shù)據(jù)。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;}?
總結(jié)
以上是生活随笔為你收集整理的jpa : criteria 作排除过滤、条件中除去查出的部分数据、JPA 一个参数可查询多个字段的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中Socket通信用法实例详解
- 下一篇: VUE:父子组件间传参、子组件传值给父组