網(wǎng)上有很多關(guān)系Springboot data jpa多條件分頁(yè)排序查詢(xún)的例子, 但一般都不是很完整, 有分頁(yè),無(wú)排序,有排序,無(wú)多排序等,這里分享一個(gè)帶多條件,分頁(yè)及多排序的一個(gè)完整實(shí)例, 為了大家完整的查看,這里給出所有的信息, 不省略任何部分
定義實(shí)體類(lèi):
package com.yt.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY ) private int id; @Column(name = "names", unique = false, nullable = true, length = 50) private String names; @Column(name = "email", length = 30) private String email; private String sex; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNames() { return names; } public void setNames(String names) { this.names = names; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
定義Repository接口
package com.yt.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import com.yt.entity.Student; public interface StudentRepository extends JpaRepository<Student,Integer>,JpaSpecificationExecutor<Student>{ } //JpaSpecificationExecutor<Student> 這個(gè)是為了多條件分頁(yè)排序使用,如果只是簡(jiǎn)單的增刪改查,就不需要
實(shí)現(xiàn)Service層接口
package com.yt.service; import java.util.List; import org.springframework.data.domain.Page; import com.yt.entity.Student; public interface StuService { Page<Student> findByCondition(Integer page, Integer size, String names, String sex); }
實(shí)現(xiàn)Service層接口實(shí)現(xiàn)類(lèi)
package com.yt.service; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.data.domain.Sort.Order; import org.springframework.data.jpa.domain.Specification; import javax.persistence.criteria.Predicate; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import com.yt.entity.Student; import com.yt.repository.StudentRepository; @Service public class StuServiceImpl implements StuService{ @Autowired private StudentRepository stuRepository; @Override public Page<Student> findByCondition(Integer page, Integer size, String names, String sex) { //多排序 List<Order> list=new ArrayList< Order>(); list.add( new Order(Direction.DESC, "id")); list.add( new Order(Direction.ASC, "email")); Sort sort = Sort.by(list); //Pageable 封裝了分頁(yè)的參數(shù),當(dāng)前頁(yè),每頁(yè)顯示的條數(shù),注意:它的當(dāng)前頁(yè)是從0開(kāi)始的 Pageable pageable = PageRequest.of(page-1, size, sort); Specification<Student> spec = (root, criteriaQuery, criteriaBuilder) -> { List<Predicate> predicates = new ArrayList<Predicate>(); if (!StringUtils.isEmpty(names)){ predicates.add(criteriaBuilder.like(root.get("names"), "%" + names + "%")); } if (!StringUtils.isEmpty(sex)){ predicates.add(criteriaBuilder.like(root.get("sex"), sex)); } //將多條件連接在一起 return criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction(); }; return stuRepository.findAll(spec,pageable); } }
控制器層調(diào)用:
@RequestMapping(value="findallby") public String findByCondition( @RequestParam(value = "page", defaultValue = "1") Integer page, @RequestParam(value = "size", defaultValue = "10") Integer size, @RequestParam(value = "names", defaultValue = "") String names, @RequestParam(value = "sex", defaultValue = "") String sex ) { Page<Student> result = stuSer.findByCondition(page, size, names, sex); List<Student> list = result.getContent(); //所有的數(shù)據(jù) Long totals = result.getTotalElements(); //總條數(shù) int pages = result.getTotalPages(); //總頁(yè)數(shù) System.out.println("共有" + pages + "頁(yè), " + totals + "條"); for(Student s:list) { System.out.println(s.getNames() + " "+ s.getId()); } return "已經(jīng)實(shí)現(xiàn)了多條件分頁(yè)排序查詢(xún)"; }
瀏覽器訪(fǎng)問(wèn),控制臺(tái)如下
http://localhost:8080/stu/findallby?page=1&names=hi
Hibernate: select student0_.id as id1_0_, student0_.email as email2_0_, student0_.names as names3_0_, student0_.sex as sex4_0_ from student student0_ where student0_.names like ? order by student0_.id desc limit ?
共有1頁(yè), 3條
hibername 48
hibername 47
hibername 46
JpaRepository 簡(jiǎn)單條件查詢(xún)