- 适合多条件模糊查询和筛选
参考1:https://cloud.tencent.com/developer/article/1429349
参考2:https://blog.csdn.net/J080624/article/details/84581231
创建接口
// 创建接口
public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<Users> {
}
单条件查询 ```java /**
- 单条件查询
- 需求:根据用户姓名查询数据
*/
@Test
public void test1(){
Specification
spec = new Specification () {
}; List/**
* @return Predicate:定义了查询条件
* @param Root<Users> root:根对象。封装了查询条件的对象
* @param CriteriaQuery<?> query:定义了一个基本的查询.一般不使用
* @param CriteriaBuilder cb:创建一个查询条件
*/
@Override
public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate pre = cb.equal(root.get("username"), "王五");
return pre;
}
list = this.usersDao.findAll(spec); } ```
多条件查询
/**
* 多条件查询 方式一
*/
@Test
public void test2() {
Specification<Users> spec = new Specification<Users>() {
@Override
public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<>();
list.add(cb.equal(root.get("username"), "王五"));
list.add(cb.equal(root.get("userage"), 24));
//此时条件之间是没有任何关系的。
Predicate[] arr = new Predicate[list.size()];
return cb.and(list.toArray(arr));
}
};
List<Users> list = this.usersDao.findAll(spec);
}
分页排序
/**
* 需求:查询数据库中王姓的用户,做分页处理,并且根据用户 id 做倒序排序
*/
@Test
public void test6(){
//排序等定义
Sort sort = new Sort(Sort.Direction.DESC,"userid");
//分页的定义
Pageable pageable = new PageRequest(0,2, sort);
//查询条件
Specification<Users> spec = new Specification<Users>() {
@Override
public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
return cb.like(root.get("username").as(String.class),
"王%");
}
};
Page<Users> page = this.usersDao.findAll(spec, pageable);
log.debug("总条数:"+page.getTotalElements());
log.debug("总页数:"+page.getTotalPages());
List<Users> list = page.getContent();
}