오늘의 질문 조회와 같이 리스트 전체가 아닌 하나의 객체만 가져오려는 JPQL 문법에서 limit을 지원하지 않는다는 점을 알게 되었다.
nativeQuery를 사용하면 limit절이 제공되지만, jpql에서는 이를 대체하는 다른 방안을 사용해야 한다.
JPA가 추상화한 페이징 처리 API → DB마다 동일하게 구현이 가능
asc/desc로 정렬 후, Spring Data JPA에서 기본 제공하는 페이징 관련 API를 사용한다.
setFirstResult(int startPosition)
: 조회 시작 위치(0부터 시작)setMaxResults(nt maxResult)
: 조회할 데이터 수TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m ORDER BY m.username DESC", Member.class);
query.setFirstResult(10); // 11~30번까지 총 20건의 데이터를 조회한다.
query.setMaxResults(20);
query.getResultList();
→ 데이터베이스 방언에 의해 종류에 따라 이 페이징 쿼리가 변환되는 SQL문은 조금씩 다르다.
첫 번째 결과 가져오기
JpaRepository 인터페이스를 구현할 때 기본 제공되는 메서드 중 First 가 들어가도록 메서드명을 지정해주면 내부적으로 쿼리 결과의 첫 번째 값을 반환해준다.
@Query("SELECT q FROM QnA q ORDER BY q.id DESC")
List<QnA> findFirstQnA();
정렬(order by)한 목록의 상위에서 결과 가져오기
List<QnA> findTop3ByOrderByIdDesc();
nativeQuery에서는 limit절을 기본적으로 제공한다.
nativeQuery = true를 추가하면 네이티브 쿼리를 사용할 수 있다.
@Query("SELECT q FROM QnA q ORDER BY q.id DESC LIMIT 1", nativeQuery = true))
List<QnA> findFirstQnA();