페이징

페이징에서 반드시 order by가 들어가야 제대로 페이징되는지 확인할 수 있다. 왜냐하면 sorting이 되면서 순서대로 가져와야하기 때문이다.

JPA는 페이징을 다음 두 API로 추상화

  1. setFirstResult(int startPosition) : 조회 시작 위치
(0부터 시작)

  2. setMaxResults(int maxResult) : 조회할 데이터 수

따라서 개발자는 조회 시작할 위치와 조회할 데이터 수만 넣어주면 된다!

//페이징 쿼리
String jpql = "select m from Member m order by m.name desc";

List<Member> resultList = em.createQuery(jpql, Member.class)

    .setFirstResult(10)

    .setMaxResults(20)

    .getResultList();


엔티티 매핑정보와 Dialect 정보를 합쳐서 쿼리가 실행된다. H2의 Dialect 페이징 표준은 limit과 offset이다.

페이징 API - MySQL 방언

SELECT
    M.ID AS ID,
    M.AGE AS AGE,
    M.TEAM_ID AS TEAM_ID,
FROM
    MEMBER M
ORDER BY
    M.NAME DESC LIMIT ?, ?

페이징 API - Oracle 방언 : 3 Depth ROWNUM

SELECT * FROM
    ( SELECT ROW_.*, ROWNUM ROWNUM_
    FROM
        ( SELECT
            M.ID AS ID,
            M.AGE AS AGE,
            M.TEAM_ID AS TEAM_ID,
            M.NAME AS NAME
        FROM MEMBER M
        ORDER BY M.NAME
        ) ROW_
    WHERE ROWNUM <= ?
    )
WHERE ROWNUM_ > ?

Last updated