우주먼지

💡 Paging API

JPA는 페이징 API를 다음 두 API로 추상화 해뒀다.

  • 조회 시작위치(0부터 시작)
    • setFirstResult(int startPosition)
  • 조회할 데이터 수
    • setMaxResults(int maxResult)

 

예시

  • 모든 데이터 베이스의 방언이 동작한다.
  • LIMIT & OFFSET은 MySQL 방언이다.
    • hibernate.dialect를 Oracle12cDialect로 변경해주면
      Oracle 방언인 rownum 3 depth 전략으로 페이징을 짠다.
// Member Class에 toString()을 Override 해준다.
for (int i=0, i<100; i++) {
    Member member = new Member();
    member.setUsername("member" + i);
    member.setAge(i);
    em.persist(member);
}

em.flush();
em.clear();

// desc = 역순
List<Member> resultList = em
    .createQuery("select m from Member m order by m.age desc", Member.class)
    .setFirstResult(1)
    .setMaxResult(10)
    .getResultList();

System.out.println("result.size = " + result.size());
for (Member m : result) {
    System.out.println("m = " + member)
}
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 DESC LIMIT ?, offset ?
  • 위 쿼리의 Oracle 방언
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_ > ?

💡 결과 조회 API

  • query.getResultList()
    • 결과가 하나 이상인 경우(컬렉션일 때), 리스트를 반환한다.
  • query.getSingleResult()
    • 결과가 정확히 하나, 단일 객체를 반환한다.(정확히 하나가 아니면 예외 발생)
    • 결과가 없을때 - NoResultException
    • 둘 이상일 때 - NonUniqueResultException

'Database > JPQL' 카테고리의 다른 글

JQPL 경로표현식  (2) 2023.03.19
JPQL Type Query & Sub Query  (0) 2023.03.11
JPQL Projection  (0) 2023.03.11
JPQL Parameter Binding  (0) 2023.03.11
JPQL Basic  (2) 2023.03.05
profile

우주먼지

@o귤o

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그