우주먼지

1. 💡 Paging API

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

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

 

1.1. 예시

  • 모든 데이터 베이스의 방언이 동작한다.
  • LIMIT & OFFSET은 MySQL 방언이다.
    • hibernate.dialect를 Oracle12cDialect로 변경해주면
      Oracle 방언인 rownum 3 depth 전략으로 페이징을 짠다.
<code />
// 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) }
<code />
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 방언
<code />
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_ > ?

2. 💡 결과 조회 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

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

검색 태그