1. 程式人生 > >spring data JpaSpecificationExecutor介面分頁帶多種條件查詢

spring data JpaSpecificationExecutor介面分頁帶多種條件查詢

DAO層繼承JpaSpecificationExecutor介面

@Override
public Page<AbnormalEntity> fetchAbnormals(QueryCondition query,Integer page,Integer rows) {

//解析出paramrule物件 取出field,op,value對應的值
List<ParamRules> paramlist = Lists.newArrayList(query.getRules());

final Paraminfo param = new Paraminfo();
for(ParamRules rules:paramlist){
if(rules.getField().equals("companyAreaCode")){
param.setCompanyAreaCode(rules.getValue());
}
if(rules.getField().equals("abntypecode")){
param.setAbntypecode(rules.getValue());
}
if(rules.getField().equals("abntarget")){
param.setAbntarget(rules.getValue());
}
if(rules.getField().equals("state")){
param.setState(rules.getValue());
}
if(rules.getField().equals("abncode")){
param.setAbncode(rules.getValue());
}
if(rules.getField().equals("compname")){
param.setCompname(rules.getValue());
}
if(rules.getField().equals("busbrandno")){
param.setBusbrandno(rules.getValue());
}
if(rules.getField().equals("occurtime_start")){
param.setStartdate(rules.getValue());
}
if(rules.getField().equals("occurtime_end")){
param.setEnddate(rules.getValue());
}
}

Pageable pageable=new PageRequest(page-1, rows,Sort.Direction.ASC,"abncode");
Specification<AbnormalEntity> spec = new Specification<AbnormalEntity>() {
@Override
public Predicate toPredicate(Root<AbnormalEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>(); 

if(!StringUtils.isEmpty(param.getCompanyAreaCode())){
predicates.add(cb.like(root.get("areacode").as(String.class), "%"+param.getCompanyAreaCode()+"%"));//行政區劃編號
}
if(!StringUtils.isEmpty(param.getAbntypecode())){
predicates.add(cb.equal(root.get("abntypecode").as(String.class), param.getAbntypecode()));//異常型別編號
}
if(!StringUtils.isEmpty(param.getAbntarget())){
predicates.add(cb.equal(root.get("abntarget").as(String.class), param.getAbntarget()));//異常物件
}
if(!StringUtils.isEmpty(param.getState())){
predicates.add(cb.equal(root.get("state").as(String.class), param.getState()));//處理狀態
}
if(!StringUtils.isEmpty(param.getAbncode())){
predicates.add(cb.equal(root.get("abncode").as(String.class), param.getAbncode()));//異常編號
}
if(!StringUtils.isEmpty(param.getCompname())){
predicates.add(cb.like(root.get("compname").as(String.class), "%"+param.getCompname()+"%"));//業戶名稱
}
if(!StringUtils.isEmpty(param.getBusbrandno())){
predicates.add(cb.like(root.get("busbrandno").as(String.class), "%"+param.getBusbrandno()+"%"));//車牌號
}
if(!StringUtils.isEmpty(param.getStartdate())){
predicates.add(cb.greaterThanOrEqualTo(root.<Date>get("occurtime"), param.getStartdate()));//開始時間  
}
if(!StringUtils.isEmpty(param.getEnddate())){
predicates.add(cb.lessThanOrEqualTo(root.<Date>get("occurtime"), param.getEnddate()));//結束時間 
}


               // and到一起的話所有條件就是且關係,or就是或關係  
               return cb.and(predicates.toArray(new Predicate[predicates.size()]));  
}
        };
return abnormalDao.findAll(spec,pageable);
}