代码如下:
@Override
public Page<FlowBusinessMapEntity> findByParam(QueryBusinessVo searchParam, Pageable pageable) {
// specification 是一个匿名内部类
Specification<FlowBusinessMapEntity> specification = new Specification<FlowBusinessMapEntity>() {
/**
*
* @param root 查询类型,根据实体类匹配类型
* @param query 查询条件
* @param cb 构建条件,有in,and,or,like等用法。
* @return
*/
@Override
public Predicate toPredicate(Root<FlowBusinessMapEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
if (!StringX.nullity(searchParam.getBusinessNo())) {
predicates.add(cb.equal(root.get("businessNo").as(String.class), searchParam.getBusinessNo()));
}
if (!StringX.nullity(searchParam.getBusinessType())) {
predicates.add(cb.equal(root.get("businessType").as(String.class), searchParam.getBusinessType()));
}
// IN的用法,可直接传list和数组。 list中数据类型,要与实体类中类型匹配,不然需要进行类型转换。
if (!StringX.nullity(searchParam.getState())) {
String[] split = searchParam.getState().split(",");
predicates.add(cb.in(root.get("state")).value(split));
}
if (searchParam.getStartDate() != null && searchParam.getEndDate() != null) {
predicates.add(cb.between(root.get("applyDate"), searchParam.getStartDate(), searchParam.getEndDate()));
}
if (!StringX.nullity(searchParam.getOperator())) {
predicates.add(cb.equal(root.get("operator").as(String.class), searchParam.getOperator()));
}
if (!StringX.nullity(searchParam.getCguid())) {
predicates.add(cb.equal(root.get("cguid").as(String.class), searchParam.getCguid()));
}
return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
}
};
Page<FlowBusinessMapEntity> page = queryBusinessDao.findAll(specification, pageable);
return page;
}
本文深入探讨了使用Spring Data JPA的Specification接口进行复杂业务条件查询的方法,通过实例展示了如何构建灵活的查询条件,包括精确匹配、范围查询、枚举匹配及日期区间筛选等,适用于需要高效数据检索的企业级应用。

被折叠的 条评论
为什么被折叠?



