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 전략으로 페이징을 짠다.
- hibernate.dialect를 Oracle12cDialect로 변경해주면
<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 |