写代码过程中我们经常遇到多条件组合查询,用户可以选择部分筛选条件。
以下面职员实体类为例
@Entity
@Data
@Table
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
//单位id
private long organId;
private String organName;
//性别
private String sex;
//出生年月
private Integer birthday;
//人员类别
private String type;
//身份证号
private String identityNumber;
//职务/等级
private String level;
//职称
private String title;
//人员状态 (在岗)
private String state;
//现任岗位
private String work;
//入职年月
private Date joinTime;
//毕业学校
private String scholl;
//上岗形式
private String joinType;
//专业学历
private String education;
//毕业时间
private Date graduateTime;
//参加培训次数
private String trainTimes;
//备注
private String notes;
//多对一关系,职员所属的机构对象
@ManyToOne(targetEntity = Organ.class)
//name外键名称 referencedColumnName 当前外键参照的主表主键字段名称
@JoinColumn(name = "organ_employee_id" ,referencedColumnName = "id")
private Organ organ;
}
1:继承JpaSpecificationExecutor接口
@Repository
public interface EmployeeDao extends JpaRepository<Employee,Long> , JpaSpecificationExecutor<Employee> {
}
2:构造并使用查询条件
//接收查询条件对象Finder
public Page<Employee> find2(Finder finder) {
Date startTime = finder.getStartTime();
String keyword = finder.getKeyword();
String type = finder.getType();
Date endTime = finder.getEndTime();
String organName = finder.getOrganName();
//起始页码
int start = finder.getStart();
//构造查询条件
Specification<Employee> spec = new Specification<Employee>() {
@Override
public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<Predicate>();
/*if(tname!=null&&!"".equals(tname)) {
list.add(cb.like(namepath,"%"+tname+"%"));
}*/
//查询条件如果不为空,就拼接进查询条件中
if (StringUtils.isNotBlank(keyword)) {
Path<Object> name = root.get("name");
predicates.add(cb.like(name.as(String.class), keyword+"%"));
}
//机构是关联表的实体,查询条件只有机构名 这样处理
if (StringUtils.isNotBlank(organName)) {
//
Path<Organ> organName1 = root.<Organ>get("organ").get("organName");
predicates.add(cb.equal(organName1.as(String.class), organName));
}
if (startTime != null) {
Path<Object> joinTime = root.get("joinTime");
predicates.add(cb.greaterThanOrEqualTo(joinTime.as(Date.class),startTime));
}
if (endTime != null) {
Path<Object> joinTime = root.get("joinTime");
predicates.add(cb.lessThanOrEqualTo(joinTime.as(Date.class),endTime));
}
if (StringUtils.isNotBlank(type)) {
Path<Object> type1 = root.get("type");
predicates.add(cb.equal(type1.as(String.class), type1));
}
return cb.and(predicates.toArray(p));
}
};
//分页 起始页码,每页数量
Pageable pageable = new PageRequest((finder.getStart()-1)*50+, 50);
Page<Employee> all = employeeDao.findAll(spec, pageable);
return all;
}