上一篇讲到如何用Specification进行复杂查询,这篇就简单说下本人更喜欢的操作Strem进行复杂查询。
话不多说,先上代码:
//自定义条件查询
Long proId = ParamUtil.getLongParameter(entity.getProjectId(), -1L);
//定义匹配字段
String numberOrname = entity.getNumberOrname();
String costCategory = entity.getCostCategory();
String contractMoneyMin = entity.getContractMoneyMin();
String contractMoneyMax = entity.getContractMoneyMax();
List<ContractInfoBean> list = contractInfoRepo.findAllByProjectIdAndType(proId, type1);
//获取list的流,进行逐条bean的匹配操作 这里需要重写test方法
List<ContractInfoBean> fileProjectList = list.stream().filter(new java.util.function.Predicate<ContractInfoBean>() {
@Override
public boolean test(ContractInfoBean bean) {
*******************
下面就可以完全以写代码的形式设置字段匹配机制
*******************
//合同名称或编号
if (StringUtil.isNotEmpty(numberOrname)) {
if (!bean.getName().contains(numberOrname) && !bean.getNumber().contains(numberOrname)) {
return false;
}
}
//费用类别
if (StringUtil.isNotEmpty(costCategory)) {
String costTypeArray = bean.getCostTypeArray();
String[] costArray = StringUtil.split(costTypeArray, ",");
if (costArray.length < 4) {
return false;
}
if (!costCategory.equals(costArray[3])) {
return false;
}
}
// 合同金额比较
Double total = bean.getTotalContractAmount();
if (total == null) {
total = 0.0;
}
if (StringUtils.isNotBlank(contractMoneyMin)) {
if (total < Double.parseDouble(contractMoneyMin)) {
return false;
}
}
if (StringUtils.isNotBlank(contractMoneyMax)) {
if (total > Double.parseDouble(contractMoneyMax)) {
return false;
}
}
return true;
}
}).collect(Collectors.toList());
以上就是通过操作Stream完成匹配查询的设定方式,十分简单有效,不过需要注意的是:
***返回值是Boolean类型,如果该条数据不符合条件,直接return false,就可以将该条数据直接剔除,如果符合条件就返回true,在设置匹配条件时,还可以直接对过滤list中的对象,进行操作,因此我个人更喜欢使用这种方式进行JPA中的复杂搜索。
我相信还有更简便的方法,等待我去发现、学习,学海无涯,让我们共同努力!早日成为一名“聪明绝顶”的程序猿<( ̄3 ̄)> !