SpringBoot项目中实现多项内容查询和结果分页
实体类
public class NewsQuery {
private String title;
private String typeId;
private Boolean recommend;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getTypeId() {
return typeId;
}
public void setTypeId(String typeId) {
this.typeId = typeId;
}
public Boolean getRecommend() {
return recommend;
}
public void setRecommend(Boolean recommend) {
this.recommend = recommend;
}
@Override
public String toString() {
return "NewsQuery{" +
"title='" + title + '\'' +
", typeId='" + typeId + '\'' +
", recommend=" + recommend +
'}';
}
}
page对象来实现分页显示
function page(obj){
$("[name='page']").val($(obj).data("page"));
load();
}
$("#search-btn").click(function () {
$("[name='page']").val(0);
load();
});
function load() {
$("#table-container").load("/admin/news/search",{
title: $("[name='title']").val(),
typeId: $("[name='typeId']").val(),
recommend: $("[name='recommend']").prop('checked'),
page : $("[name='page']").val()
}
)
}
根据搜索条件,调用服务层方法得到需要的数据并返回到前端
@RequestMapping("search")
public String search(@PageableDefault(size = 5,sort = {"updateTime"},direction = Sort.Direction.DESC) Pageable pageable,
NewsQuery newsQuery,
Model model){
Page<News> page = newsService.searchNews(pageable,newsQuery);
model.addAttribute("page",page);
return "admin/news :: newsList";
}
服务层
@Override
public Page<News> searchNews(Pageable pageable, NewsQuery newsQuery) {
Page<News> page = newsDao.findAll(new Specification<News>() {
@Override
public Predicate toPredicate(Root<News> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
if(!StringUtils.isEmpty(newsQuery.getTitle())){
predicates.add(criteriaBuilder.like(root.<String>get("title"),"%"+newsQuery.getTitle()+"%"));
}
if(!StringUtils.isEmpty(newsQuery.getTypeId())){
predicates.add(criteriaBuilder.equal(root.<Type>get("type").get("id"),newsQuery.getTypeId()));
}
if(newsQuery.getRecommend()!=null && newsQuery.getRecommend()){
predicates.add(criteriaBuilder.equal(root.<Boolean>get("recommend"),newsQuery.getRecommend()));
}
criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()]));
return null;
}
}, pageable);
return page;
}
在dao层,需要通过继承接口实现JPA的使用
public interface NewsDao extends JpaRepository<News,Long> , JpaSpecificationExecutor<News> {
}