1.定义新查询条件实体类
public class NewQuery {
private String title; //新闻标题
private Long typeId; //新闻类型
private boolean recommend; //是否为推荐新闻
}
2.Service层
@Override
public Page<News> listNews(Pageable pageable, NewQuery newQuery) {
return newsRepository.findAll(new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) {
// root 数据库中的字段名
// CriteriaBuilder 构建查询条件
// CriteriaQuery 执行查询条件
// 1. 创建集合 存储查询条件
List<Predicate> list = new ArrayList<>();
// 2. 添加查询条件
if (!"".equals(newQuery.getTitle()) && newQuery.getTitle() != null) {
// 当title 有值时 项目list集合中存储查询条件 select * from t_user where name like %zhang%
list.add(cb.like(root.<String>get("title"), "%" + newQuery.getTitle() + "%"));
}
if (newQuery.getTypeId() != null) {
list.add(cb.equal(root.<Long>get("type").get("id"), newQuery.getTypeId()));
}
if (newQuery.isRecommend()) {
list.add(cb.equal(root.<Boolean>get("recommend"), newQuery.isRecommend()));
}
// 3. 执行查询
cq.where(list.toArray(new Predicate[list.size()]));
return null;
}
},pageable);
}
3.Repository
public interface NewsRepository extends JpaRepository<News, Long>, JpaSpecificationExecutor {
}