페이징
페이징에서 반드시 order by가 들어가야 제대로 페이징되는지 확인할 수 있다. 왜냐하면 sorting이 되면서 순서대로 가져와야하기 때문이다.
JPA는 페이징을 다음 두 API로 추상화
setFirstResult(int startPosition) : 조회 시작 위치 (0부터 시작)
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
Was this helpful?