JpaSpecificationExecutor的复杂模糊查询
(1)在dao层的类中继承JpaSpecificationExecutor
(2)在service的实现层
@Override
public QueryResultObject query(RequestCondition queryCondition) {
RepositoryUtil. margeDataStatus(queryCondition);
//参数转换
StSettlementItem info=AssembleFilter(queryCondition);
//按条件封装Specification
Specification<StSettlementItem> specification=MergeCanshu(info);
//分页查询条件
Pageable pageable=new PageRequest(queryCondition.getPageIndex()-1, queryCondition.getPageSize());
QueryResultObject result=BeanUtil.pageToQueryResultObject(stSettlementItemRepository.findAll(specification, pageable), StSettlementItemVO.class);
return result;
}
private StSettlementItem AssembleFilter(RequestCondition queryCondition) {
//传入的参数进行转换
List<QueryFilter> qlist=queryCondition.getQueryFilter();
StSettlementItem info=new StSettlementItem();
if(qlist != null && !qlist.isEmpty()){
for(QueryFilter qf : qlist){
String fieldName = qf.getFieldName();
if(fieldName.equals("settlementItemName")){
info.setSettlementItemName(qf.getValue().toString());
}
if(fieldName.equals("settlementItemType")){
info.setSettlementItemType(qf.getValue().toString());
}
}
}
return info;
}
private Specification<StSettlementItem> MergeCanshu(StSettlementItem info) {
Specification<StSettlementItem> specification=new Specification<StSettlementItem>() {
@Override
public Predicate toPredicate(Root<StSettlementItem> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates=new ArrayList<Predicate>();
Calendar c=Calendar.getInstance();
if(StringUtil.isNotEmpty(info.getClearunit())){
//实现jpa中条件查询时使用in查询
CriteriaBuilder.In<String> in = cb.in(root.get("clearunit"));
String[] ids=info.getClearunit().split(",");
for (String id : ids) {
in.value(id);
}
predicates.add(in);
}
//时间范围的查询
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
if(StringUtil.isNotEmpty(info.getStartDate())&&StringUtil.isNotEmpty(info.getEndDate())){
try {
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(sdf.parse(info.getEndDate()));
rightNow.add(Calendar.DAY_OF_MONTH, +1);
predicates.add(cb.between(root.get("publishUserItme"),
sdf.parse(filter.getStartDate()),
rightNow.getTime()));
} catch (ParseException e) {
e.printStackTrace();
}
}
if(StringUtil.isNotEmpty(info.getSettlementItemName())){
//模糊
predicates.add(cb.like(root.get("settlementItemName").as(String.class), "%" + info.getSettlementItemName() + "%"));
}
//不需要排序查询时
//return cb.and(predicates.toArray(new Predicate[predicates.size()]));
//需要排序查询时
query.where(cb.and(predicates.toArray(new Predicate[predicates.size()])));
//排序的升序和倒叙的写法
query.orderBy(cb.desc(root.get("schemeCode")),cb.asc(root.get("schemeCode")));
return query.getRestriction();
}
};
return specification;
}