SpringBoot+JPA动态分页查询
代码示例
1.实体类Student
@Entity
@Table(name = "tb_student")
public class Student {
//主键
@Id
@Column(length = 50, nullable = false)
private String id;
//学生姓名
@Column(length = 50, nullable = false)
private String stuName;
//创建时间
@Column
private Long createTime;
//get()与set()此处省略
}
2.实体封装类StudentVO
public class StudentVO extends Student {
//当前页
private int page = 1;
//页面条数(默认20)
private int limit = 20;
public StudentVO () {
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
}
3.接口StudentService
public interface StudentService {
Page<Student> list(StudentVO studentVO);
}
4.接口实现StudentServiceImpl
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
StudentDao studentDao;
public Page<Student> list(StudentVO studentVO) {
PageRequest page = new PageRequest(studentVO.getPage() - 1, studentVO.getLimit(),new Sort(Sort.Direction.DESC, "createTime"));
Page<Student> all = studentDao.findAll((root, query, builder) -> buildQueryParams(studentVO, root, builder), page);
return all;
}
//拼装查询条件
private Predicate buildQueryParams(StudentVO studentVO, Root<Student> root, CriteriaBuilder builder) {
List<Predicate> list = new ArrayList<>();
if (studentVO!= null) {
if (StringUtils.isNotEmpty(studentVO.getStuName())) {
list.add(builder.equal(root.get("stuName"), studentVO.getStuName()));
}
}
return builder.and(list.toArray(new Predicate[]{}));
}
}
5.持久层StudentDao
@Repository
public interface StudentDao extends JpaRepository<Student, String>, JpaSpecificationExecutor<Student> {
}