jpql limit 문법 사용하기

dev-jjun·2023년 8월 13일
0

Server

목록 보기
18/33
post-thumbnail

오늘의 질문 조회와 같이 리스트 전체가 아닌 하나의 객체만 가져오려는 JPQL 문법에서 limit을 지원하지 않는다는 점을 알게 되었다.

nativeQuery를 사용하면 limit절이 제공되지만, jpql에서는 이를 대체하는 다른 방안을 사용해야 한다.

1. 페이징 API

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문은 조금씩 다르다.

2. first 키워드 사용

첫 번째 결과 가져오기

JpaRepository 인터페이스를 구현할 때 기본 제공되는 메서드 중 First 가 들어가도록 메서드명을 지정해주면 내부적으로 쿼리 결과의 첫 번째 값을 반환해준다.

@Query("SELECT q FROM QnA q ORDER BY q.id DESC")
List<QnA> findFirstQnA();

3. top 키워드 사용

정렬(order by)한 목록의 상위에서 결과 가져오기

List<QnA> findTop3ByOrderByIdDesc();

4. nativeQuery 사용

nativeQuery에서는 limit절을 기본적으로 제공한다.

nativeQuery = true를 추가하면 네이티브 쿼리를 사용할 수 있다.

@Query("SELECT q FROM QnA q ORDER BY q.id DESC LIMIT 1", nativeQuery = true))
List<QnA> findFirstQnA();
profile
서버 개발자를 꿈꾸며 성장하는 쭌입니다 😽

0개의 댓글