如何使用JPA实现分页查询?代码举例讲解

在JPA中可以通过以下方式实现分页查询:

  1. 在JPQL或Criteria查询中使用OFFSET和FETCH关键字指定偏移量和获取数量。
String jpql = "SELECT u FROM User u ORDER BY u.id DESC";  
Query query = em.createQuery(jpql);
query.setFirstResult(10);  // 从第11条数据开始  
query.setMaxResults(20);  // 获取20条数据
CriteriaBuilder cb = em.getCriteriaBuilder();  
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class); 
cq.select(root).orderBy(cb.desc(root.get("id")));  
TypedQuery<User> query = em.createQuery(cq);
query.setFirstResult(10);  
query.setMaxResults(20);  
  1. 在Repository或Service层创建分页查询方法,接收页码及页大小参数,内部转换为OFFSET和FETCH。
public Page<User> findPaginated(int pageNo, int pageSize) {  
    int offset = (pageNo - 1) * pageSize;
    String jpql = "SELECT u FROM User u ORDER BY u.id DESC";  
    Query query = em.createQuery(jpql);
    query.setFirstResult(offset);
    query.setMaxResults(pageSize);
    List<User> contents = query.getResultList();
    long totalCount = countUser();
    Page page = new Page(contents, totalCount, pageSize, pageNo);
    return page;
}
  1. 使用Page对象包装查询结果,包含当前页数据、总记录数、页大小和当前页码等信息。