接着前面的博客看
Query抽取
- Query是咱们的查询对象
1 BaseQuery
- 有经验的人都会创建父类
- 方便扩展
- 公共的代码
- 制定规范
- 目前咱们Query需要做的
- 四个字段(currrentPage,pageSize,orderType,orderName)
- 让每个子类都有一个:
createSpec()方法 :查询规则
- 创建一个Sort对象
- 解决传过来的是当前页从1开始(SpringDataJpa是从0开始计算)
/**
* 父类的作用:
* 1.提供一些公共的属性的方法(少写代码)
* 2.对子类形成相应的规范
* 3.为了以后代码的扩展性
*/
public abstract class BaseQuery {
//分页 -> 当前第几页
private int currentPage=1;
//分页 -> 每页条数
private int pageSize=10;
//排序 -> 排序的类型 true(DESC)/false(ASC)
private boolean orderType;
//排序 -> 排序的字段 -> 如果这个字段为null,就代表不排序
private String orderName;
//创建排序对象
public Sort createSort(){
if(StringUtils.isNotBlank(orderName)){
//orderName有值才做排序
Sort sort = new Sort(orderType?Sort.Direction.DESC:Sort.Direction.ASC,orderName);
return sort;
}
return null;
}
//要求只要继承了我,就必需有一个方法叫:createSpec()
public abstract Specification createSpec();
public int getJpaPage() {
return currentPage-1;
}
//getter,setter....
}
2 EmployeeQuery
- 继承BaseQuery 抽象类
- 设置当前对应的Domain的特有查询字段
- 实现
createSpec()
/**
* 员工查询
*/
public class EmployeeQuery extends BaseQuery {
//用户名
private String username;
//邮件
private String email;
//年龄
private Integer age;
//查询的规则应该在查询对象中来创建
@Override
public Specification createSpec(){
Specification<Employee> specification = Specifications.<Employee>and()
.like(StringUtils.isNotBlank(username), "username", "%" + username + "%")
.like(StringUtils.isNotBlank(email), "email", "%" + email + "%")
.gt(age != null, "age", age)
.build();
return specification;
}
//getter,setter...
}
7.3 测试
/**
* 有Query的查询
* @throws Exception
*/
@Test
public void testJpaSpec04() throws Exception{
//以后咱们的查询数据是从前台传过来的,就会生成EmployeeQuery对象
EmployeeQuery query = new EmployeeQuery();
// query.setUsername("1");
// query.setEmail("2");
// query.setAge(18);
query.setOrderName("age");
query.setOrderType(true);
//创建排序对象
Sort sort = query.createSort();
//创建分页对象(分页对象从前台传过来)
Pageable pageable = new PageRequest(query.getJpaPage(),query.getPageSize(),sort);
//规则对象(查询条件)
Specification<Employee> spec = query.createSpec();
//功能执行
Page<Employee> page = employeeRepository.findAll(spec, pageable);
page.forEach(e-> System.out.println(e));
}