Spring Data JPA Specification复杂分页查询、排序
public ChiticPageResponse<WorkSheetResponse> getListPurviewWorkSheet(Integer pageNo, Integer pageSize,Integer workSheetState,Integer checkState,String workSheetName,String deveName,Long dutyGroup,Long dutyUser,String position) { Specification<WorkSheet> specification = (Specification <WorkSheet>) (root, query, cb) -> { List <Predicate> predicates = new ArrayList <>(); Long userId = CurrentTokenHolder.get().getId(); List<WorkSheetGroupUser> byUserId = workSheetGroupUserRepository.findByUserId(userId); Set<Integer> set = byUserId.stream().map(WorkSheetGroupUser::getRights).collect(Collectors.toSet()); if(!set.contains(WorkSheetRightsEnum.HIGN_VIP.getCode()) && set.contains(WorkSheetRightsEnum.GENERAL_VIP.getCode())){ //只能查看自己创建的工单 predicates.add(cb.equal(root.get("createUser"), userId)); } if(!set.contains(WorkSheetRightsEnum.HIGN_VIP.getCode()) && set.contains(WorkSheetRightsEnum.FIX_USER.getCode())){ //只能查看责任人是自己或者责任组是当前用户的所在组 List<WorkSheetGroupUser> byUserGroup = workSheetGroupUserRepository.findByUserId(userId); Set<Long> setGroup = byUserGroup.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))); } //查询删除标识为0 的 predicates.add(cb.equal(root.get("isDelete"), 0)); if (null != workSheetState) { predicates.add(cb.equal(root.get("workSheetState"), workSheetState)); } if (null != checkState) { predicates.add(cb.equal(root.get("checkState"), checkState)); } 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(workSheetName)){ predicates.add(cb.like(root.get("workSheetName"), "%" + workSheetName + "%")); } if(StringUtils.isNotBlank(deveName)){ predicates.add(cb.like(root.get("deveName"), "%" + deveName + "%")); } if(StringUtils.isNotBlank(position)){ predicates.add(cb.like(root.get("position"), "%" + position + "%")); } query.where(predicates.toArray(new Predicate[predicates.size()])); return query.getRestriction(); }; PageRequest pageRequest = PageRequest.of(pageNo, pageSize,Sort.by(Sort.Direction.DESC,"createTime")); //按照createTime排序 Page <WorkSheet> page = workSheetRepository.findAll(specification, pageRequest); List<WorkSheet> content = page.getContent(); List<WorkSheetResponse> workSheetListResponse = CopyUtil.copyList(content, WorkSheetResponse.class); return ChiticPageResponse.of(workSheetListResponse, page.getTotalElements(), page.getTotalPages()); }
JPA新增、修改的坑
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。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

更多精彩