본문 바로가기
Back-end/JPA 개념

25. JPQL - 페이징

by devraphy 2022. 4. 25.

0. 개요

- JPQL에서 페이징을 사용하는 방법에 대해서 알아보자.

 

 

1. 개념

a) 페이징 이란

- 페이징이란 조회된 결과를 가져올 때, 몇 번째 데이터부터 몇 개를 가져올지 설정하는 것이다.

- Oracle이나 MySQL을 사용하는 경우, 페이징을 설정하기 위한 쿼리가 굉장히 복잡하다.

- 하지만, JPQL은 이를 2가지 메서드로 추상화하여 매우 편리하게 사용할 수 있다.

 

 

2. 페이징 API

- JPA는 복잡한 페이징 쿼리를 다음 2가지 메서드(= API)로 추상화하여 제공한다.

- 이 2가지 메서드는 설정한 방언에 따라 페이징 쿼리로 변환된다. 

 

 

a) setFirstResult(int startPosition)

- setFirstResult() 메서드는 조회된 결과를 가져올 때의 시작 위치를 설정한다.

- 시작 위치는 0부터 시작한다.

 

 

b) setMaxResults(int maxResult)

- setMaxResults() 메서드는 조회된 결과를 가져올 때 가져올 데이터의 개수를 설정한다.

- 시작 위치로부터 몇개의 데이터를 가져올지 설정한다. 

 

 

c) 예시 코드 

- 위에서 소개한 페이징 메서드 2개를 어떻게 활용하는지 다음 예시를 통해서 알아보자. 

List<Player> result = 
        em.createQuery("select p from Player p order by p.age desc", Player.class)
        .setFirstResult(1)
        .setMaxResults(10)
        .getResultList();

for(Player player : result) {
   System.out.println("player = " + player);
}

 

- 위에서 작성한 쿼리는 다음과 같은 의미를 가진다.

  → Player 테이블의 모든 데이터를 나이 순으로 정렬하여 조회한다.

  → 조회된 결과의 1번 데이터부터 10개의 데이터를 가져온다. 

 

 

c) 예시 코드 실행 결과

- 위의 코드를 실제로 실행해보자.

- DB에는 다음과 같은 데이터가 저장되어 있다.

 

- 위의 코드를 실행하면 다음과 같은 쿼리를 확인할 수 있다.

 

- 위의 쿼리에서 확인할 수 있듯이, limit과 offset이 설정되는 것을 확인할 수 있다.

- 이 부분이 페이징의 범위가 설정된 것이다.

 

- 그렇다면 결과는 어떻게 나올까? 

 

- 결과를 확인해보면 선수 한명만 출력된 것을 확인할 수 있다.

- DB에는 2개의 선수 데이터만을 가지고 있다.

- select 쿼리의 내용은 모든 선수를 나이 순으로 조회하고, 1번 데이터부터 10개를 가져오도록 페이징을 설정하였다.

- 그러므로 0번 데이터인 박지성 선수를 제외하고 리오넬 메시부터 조회한 것이다. 

댓글