JPQL에서 페이징(Paging)은 Query 또는 TypedQuery 객체의 메서드를 사용해서 처리한. SQL의 LIMIT/OFFSET 같은 기능을 JPA에서는 코드로 설정한다.
TypedQuery<EntityType> query = em.createQuery("SELECT e FROM Entity e", EntityType.class);
query.setFirstResult(시작_위치); // OFFSET
query.setMaxResults(페이지_사이즈); // LIMIT
List<EntityType> resultList = query.getResultList();
int page = 2; // 사용자가 요청한 페이지 (0부터 시작)
int pageSize = 10;
TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m ORDER BY m.name", Member.class);
query.setFirstResult(page * pageSize); // 건너뛸 레코드 수
query.setMaxResults(pageSize); // 가져올 레코드 수
List<Member> members = query.getResultList();
setFirstResult(0)이면 처음부터 시작한다.
정렬(예: ORDER BY)을 명시하지 않으면 페이징 결과가 예측 불가능할 수 있다.
페이징과 함께 총 레코드 수를 구하려면 별도로 count 쿼리를 작성해야 한다:
Long count = em.createQuery("SELECT COUNT(m) FROM Member m", Long.class).getSingleResult();