網(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)
