在JPA中可以通过以下方式实现分页查询:
- 在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);
- 在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;
}
- 使用Page对象包装查询结果,包含当前页数据、总记录数、页大小和当前页码等信息。