Spring Data JPA Specification復雜分頁查詢、排序


@Repository
public interface DisplayScreenRepository extends JpaRepository<DisplayScreen, Long>, JpaSpecificationExecutor<DisplayScreen> {

}

 

public ChiticPageResponse<WorkSheetResponse> getPageWorkSheet(Integer pageNo, Integer pageSize,Integer workSheetState,Long dutyGroup,Long dutyUser,String searchKey) {
        Long userId = UserUtil.getUserId();
        //當前用戶所擁有的工單權限
        List<WorkSheetGroupUser> byGroupUser = workSheetGroupUserRepository.findByUserId(userId);
        Set<Integer> set = byGroupUser.stream().map(WorkSheetGroupUser::getRights).collect(Collectors.toSet());
        List<User> allByCompanyId = userRepository.findAllByCompanyId(UserUtil.getCompanyId());
        //該公司下所有的用戶id
        Set<Long> ids = allByCompanyId.stream().map(x -> x.getId()).collect(Collectors.toSet());

        Specification<WorkSheet> specification = (Specification <WorkSheet>) (root, query, cb) -> {
            List <Predicate> predicates = new ArrayList <>();
            //查詢刪除標識為0 的
            predicates.add(cb.equal(root.get("isDelete"), WorkSheetConstant.NOT_DELETED));
            predicates.add(cb.notEqual(root.get("workSheetState"), WorkSheetStateEnum.TRUE_CHECK.getCode()));
            predicates.add(cb.notEqual(root.get("workSheetState"), WorkSheetStateEnum.TRUE_CLOSE.getCode()));
            //普通管理人員1
            if(!set.contains(WorkSheetRightsEnum.HIGN_VIP.getCode()) && set.contains(WorkSheetRightsEnum.GENERAL_VIP.getCode())){
                //只能查看自己創建的工單
                predicates.add(cb.equal(root.get("createUser"), userId));
            }
            //維修人員2
            if(!set.contains(WorkSheetRightsEnum.HIGN_VIP.getCode()) && set.contains(WorkSheetRightsEnum.FIX_USER.getCode())){
                //只能查看責任人是自己或者責任組是當前用戶的所在組
                Set<Long> setGroup = byGroupUser.stream().map(WorkSheetGroupUser::getGroupId).collect(Collectors.toSet());
                CriteriaBuilder.In<Object> dutyGroup1 = cb.in(root.get("dutyGroup")).value(setGroup);
                Predicate dutyUser1 = cb.equal(root.get("dutyUser"), userId);
                predicates.add(cb.and(cb.or(dutyGroup1,dutyUser1)));
                predicates.add(cb.equal(root.get("workSheetState"), WorkSheetStateEnum.STAY_ASSIGN.getCode()));
            }
            if (null != workSheetState) {
                predicates.add(cb.equal(root.get("workSheetState"), workSheetState));
            }
            if (null != dutyGroup) {
                predicates.add(cb.equal(root.get("dutyGroup"), dutyGroup));
            }
            if (null != dutyUser) {
                predicates.add(cb.equal(root.get("dutyUser"), dutyUser));
            }

            if (StringUtils.isNotBlank(searchKey)){
                Predicate workSheetName = cb.like(root.get("workSheetName"), "%" + searchKey + "%");
                Predicate workSheetNum = cb.like(root.get("workSheetNum"), "%" + searchKey + "%");
                List<WaterHouse> byHouseNameLike = waterHouseRepository.findByHouseNameLike("%" + searchKey + "%");
                if(CollectionUtils.isNotEmpty(byHouseNameLike)){
                    Set<Long> houseIdSet = byHouseNameLike.stream().map(WaterHouse::getId).collect(Collectors.toSet());
                    CriteriaBuilder.In<Object> objectIn = cb.in(root.get("houseId"));
                    houseIdSet.forEach(x->{
                        objectIn.value(x);
                    });
                    predicates.add(cb.and(cb.or(workSheetName,workSheetNum,objectIn)));
                }else{
                    predicates.add(cb.and(cb.or(workSheetName,workSheetNum)));
                }
            }

            if (CollectionUtils.isNotEmpty(ids)) {
                CriteriaBuilder.In<Object> objectIn = cb.in(root.get("createUser"));
                ids.forEach(x->{
                    objectIn.value(x);
                });
                predicates.add(objectIn);
            }
            query.where(predicates.toArray(new Predicate[predicates.size()]));
            return query.getRestriction();
        };
        PageRequest pageRequest = PageRequest.of(pageNo-1, pageSize,Sort.by(Sort.Direction.DESC,"createTime"));
        Page <WorkSheet> page = workSheetRepository.findAll(specification, pageRequest);
        List<WorkSheet> content = page.getContent();
        List<WorkSheetResponse> workSheetListResponse = CopyUtil.copyList(content, WorkSheetResponse.class);
        /**
         * 返回前端組名和用戶名,轉換id和name
         */
        List<User> listUser = userRepository.findAll();
        List<WorkSheetGroup> listGroup = workSheetGroupRepository.findAll();

        //查詢所有泵房
        List<WaterHouse> waterHouseList = waterHouseRepository.findAll();
        List<WaterUnit> waterUnitList = waterUnitRepository.findAll();
        for(WorkSheetResponse w : workSheetListResponse){
            if(null != w.getDutyUser()){
                listUser.stream().forEach(u->{
                    if(w.getDutyUser().equals(u.getId())){
                        w.setDutyUserName(u.getName());
                    }
                });
            }
            if(null != w.getDutyGroup()){
                listGroup.stream().forEach(g->{
                    if(w.getDutyGroup().equals(g.getId())){
                        w.setDutyGroupName(g.getGroupName());
                    }
                });
            }
            if(null != w.getHouseId()){
                waterHouseList.stream().forEach(g->{
                    if(w.getHouseId().equals(g.getId())){
                        w.setHouseName(g.getHouseName());
                    }
                });
            }
            if(null != w.getUnitId()){
                waterUnitList.stream().forEach(g->{
                    if(w.getUnitId().equals(g.getId())){
                        w.setUnitSn(g.getUnitSn());
                    }
                });
            }
        }
        return ChiticPageResponse.of(workSheetListResponse, page.getTotalElements(), page.getTotalPages());
    }

 

解析出來的SQL

SELECT
    *
FROM
    work_sheet w 
WHERE
    w.is_delete = 0 
    AND w.work_sheet_state <> 6 
    AND w.work_sheet_state <> 7 
    AND ( w.work_sheet_name LIKE ? OR w.work_sheet_num LIKE ? OR w.house_id IN ( 12 ) ) 
    AND ( w.create_user IN ( 2455275655638549504, 2447384607788631040, 2445987138173535232 ) ) 
ORDER BY
    w.create_time DESC 
    LIMIT ?

 

 

JPA新增、修改的坑

1,新增時,如果數據庫有默認值字段,會將其置空。解決辦法:在service層再將默認值手動賦值一下,如下:

//工單狀態:0 待下達
copy.setWorkSheetState(0);
//驗收狀態:0未驗收
copy.setCheckState(0);
//工單來源默認0:手動輸入
copy.setWorkSheetSource(0);
//工單下達次數:0
copy.setAssignCount(0);
workSheetRepository.save(copy);

2,修改時,如果只傳部分字段,會將未傳的字段置空。解決辦法

1,根絕id查詢對象的值,在此基礎上賦值
Optional<WorkSheet> workSheetOptional = workSheetRepository.findById(request.getId());
if (!workSheetOptional.isPresent()) {
throw ChiticException.of("異常");
}
WorkSheet workSheet = workSheetOptional.get();
//賦值
workSheet.set(前台傳過來的值);
if(null != request.getRemarks()){
workSheet.setRemarks(request.getRemarks());
}
workSheetRepository.save(workSheet);
還有一種注解的方式,動態插入、更新,本人測試過,可以實現(只是不知道有沒有其他的影響)
@DynamicInsert
@DynamicUpdate


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM