复杂查询的实践
2017-12-11 本文已影响0人
焱魔王
原创 时间:2017/12/11
查询条件定义
@Data
public class AppConditionRequest {
int index;
int size;
/**
* 应用名称搜索关键字
*/
String appNameKey;
/**
* 系统架构id
*/
String sysarchitectureid;
/**
* 软件来源id
*/
String sourceid;
/**
* 软件注册时间范围--起点
*/
long startTime;
/**
* 软件注册时间范围--终点
*/
long endTime;
/**
* 应用所属部门id
*/
String deptId;
}
注:此处使用lombok的@Data标签省略了get/set方法。
自定义多条件查询
/**
* 根据条件检索应用
* @param appNameKey app名称模糊查询关键字
* @param sysarchitectureid 系统架构id
* @param sourceid 软件来源id
* @param startTime 系统启用时间范围检索--起点时间
* @param endTime 系统启用时间范围检索--终点时间
* @param deptId 应用所属部门
* @return
*/
public static Specification<AppVo> getAppByCondition(String appNameKey,
String sysarchitectureid,
String sourceid,
long startTime,
long endTime,
String deptId){
return new Specification<AppVo>() {
@Override
public Predicate toPredicate(Root<AppVo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
if(!"".equals(appNameKey)&&appNameKey!=null){
predicates.add(builder.like(root.get("name"),"%"+appNameKey+"%"));
}
if(!"".equals(sourceid)&&sourceid!=null){
predicates.add(builder.equal(root.get("sourceid"),sourceid));
}
if(!"".equals(sysarchitectureid)&&sysarchitectureid!=null){
predicates.add(builder.equal(root.get("sysarchitectureid"),sysarchitectureid));
}
if(!"".equals(deptId)&&deptId!=null){
predicates.add(builder.equal(root.get("deptid"),deptId));
}
if(startTime!=0&&endTime!=0){
if(endTime>=startTime) {
predicates.add(builder.between(root.get("registdate"), startTime,endTime));
}else{
log.error("-------------->end time less than start time!");
return null;
}
}
return builder.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
}
自定义多条件查询类使用
/**
* 根据条件查询应用(名称关键字、系统架构、软件来源、时间范围、部门id)
* @param conditions
* @return
*/
public Object getAppByConditions(AppConditionRequest conditions){
Page<AppVo> ResultList = null;
//分页
if(conditions.getIndex()!=0||conditions.getSize()!=0) {
Sort sort = new Sort(Sort.Direction.DESC,"registdate");
PageRequest pageRequest = new PageRequest(conditions.getIndex(), conditions.getSize(),sort);
ResultList = this.repo.findAll(CustomerSpecs.getAppByCondition(conditions.getAppNameKey(),
conditions.getSysarchitectureid(),
conditions.getSourceid(),
conditions.getStartTime(),
conditions.getEndTime(),
conditions.getDeptId()), pageRequest);
}
if (ResultList!=null&&ResultList.getSize()>0) {
List<AppResponse> vos = new ArrayList<>();
ResultList.forEach(vo -> {
try {
vos.add(new AppResponse(vo));
} catch (Exception e) {
}
});
return ResultFormat.getResult(vos,conditions.getIndex(),conditions.getSize(),(int)ResultList.getTotalElements());
} else {
log.info("---------------cannot find apps!");
return null;
}
}