SpringDataJpa -- 多条件查询
程序员文章站
2024-03-05 16:01:25
...
前言:使用SpringDataJpa 进行多条件查询。
一、单表的多条件查询
@Override
public Page<Courier> pageQuery(Courier model, Pageable pageable) {
//封装查询对象Specification
Specification<Courier> example = new Specification<Courier>() {
@Override
public Predicate toPredicate(Root<Courier> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
//获取客户端查询条件
String company = model.getCompany();
String courierNum = model.getCourierNum();
String type = model.getType();
//定义集合来确定Predicate[] 的长度,因为CriteriaBuilder的or方法需要传入的是断言数组
List<Predicate> predicates = new ArrayList<>();
//对客户端查询条件进行判断,并封装Predicate断言对象
if (StringUtils.isNotBlank(company)) {
//root.get("company")获取字段名
//company客户端请求的字段值
//as(String.class)指定该字段的类型
Predicate predicate = cb.equal(root.get("company").as(String.class), company);
predicates.add(predicate);
}
if (StringUtils.isNotBlank(courierNum)) {
Predicate predicate = cb.equal(root.get("courierNum").as(String.class), courierNum);
predicates.add(predicate);
}
if (StringUtils.isNotBlank(type)) {
Predicate predicate = cb.equal(root.get("type").as(String.class), type);
predicates.add(predicate);
}
//判断结合中是否有数据
if (predicates.size() == 0) {
return null;
}
//将集合转化为CriteriaBuilder所需要的Predicate[]
Predicate[] predicateArr = new Predicate[predicates.size()];
predicateArr = predicates.toArray(predicateArr);
// 返回所有获取的条件: 条件 or 条件 or 条件 or 条件
return cb.or(predicateArr);
}
};
//调用Dao方法进行条件查询
Page<Courier> page = courierDao.findAll(example, pageable);
return page;
}
二、多表多条件查询
@Override
public Page<Courier> pageQuery(Courier model, Pageable pageable) {
//封装查询对象Specification
Specification<Courier> example = new Specification<Courier>() {
@Override
public Predicate toPredicate(Root<Courier> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
//获取客户端查询条件
String company = model.getCompany();
String courierNum = model.getCourierNum();
Standard standard = model.getStandard();
String type = model.getType();
//定义集合来确定Predicate[] 的长度,因为CriteriaBuilder的or方法需要传入的是断言数组
List<Predicate> predicates = new ArrayList<>();
//对客户端查询条件进行判断,并封装Predicate断言对象
if (StringUtils.isNotBlank(company)) {
//root.get("company")获取字段名
//company客户端请求的字段值
//as(String.class)指定该字段的类型
Predicate predicate = cb.equal(root.get("company").as(String.class), company);
predicates.add(predicate);
}
if (StringUtils.isNotBlank(courierNum)) {
Predicate predicate = cb.equal(root.get("courierNum").as(String.class), courierNum);
predicates.add(predicate);
}
if (StringUtils.isNotBlank(type)) {
Predicate predicate = cb.equal(root.get("type").as(String.class), type);
predicates.add(predicate);
}
//多表的条件查询封装
if (standard != null) {
if (StringUtils.isNotBlank(standard.getName())) {
//创建关联对象(需要连接的另外一张表对象)
//JoinType.INNER内连接(默认)
//JoinType.LEFT左外连接
//JoinType.RIGHT右外连接
Join<Object, Object> join = root.join("standard",JoinType.INNER);
//join.get("name")连接表字段值
Predicate predicate = cb.equal(join.get("name").as(String.class), standard.getName());
predicates.add(predicate);
}
}
//判断结合中是否有数据
if (predicates.size() == 0) {
return null;
}
//将集合转化为CriteriaBuilder所需要的Predicate[]
Predicate[] predicateArr = new Predicate[predicates.size()];
predicateArr = predicates.toArray(predicateArr);
// 返回所有获取的条件: 条件 or 条件 or 条件 or 条件
return cb.or(predicateArr);
}
};
//调用Dao方法进行条件查询
Page<Courier> page = courierDao.findAll(example, pageable);
return page;
}
三、单表和多表区别
多表多条件查询只是在单表多条件查询的基础上使用内连接或者外连接,将两张表关联起来查询。所以Java代码的差别就在于:
//多表的条件查询封装
if (standard != null) {
if (StringUtils.isNotBlank(standard.getName())) {
//创建关联对象(需要连接的另外一张表对象)
//JoinType.INNER内连接(默认)
//JoinType.LEFT左外连接
//JoinType.RIGHT右外连接
Join<Object, Object> join = root.join("standard",JoinType.INNER);
//join.get("name")连接表字段值
Predicate predicate = cb.equal(join.get("name").as(String.class), standard.getName());
predicates.add(predicate);
}
}