순수 jpa 페이징 처리
<참고자료> 자바 ORM 표준 JPA 프로그래밍 김영한 저, 에이콘 |
<소스코드 디자인> http://colorscripter.com |
페이징 처리용 SQL을 작성하는 일은 상당히 지루하고 반복적이다. 그리고 데이터베이스마다 페이징을 처리하는 SQL문법이 다르다.
이를 보완하기 위해 JPA에서는 두 API를 추상화했다.
- setFirstResult(int startPosition) : 조회 시작 위치
- setMaxResults(int maxResult) : 조회할 데이터 수
<데이터>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
MariaDB [test]> select * from parent; +----+-----------+ | id | name | +----+-----------+ | 1 | testName1 | | 2 | testName2 | | 3 | testName3 | | 4 | testName4 | | 5 | testName5 | | 6 | testName6 | | 7 | testName7 | | 8 | testName8 | +----+-----------+ 8 rows in set (0.00 sec)
MariaDB [test]> |
cs |
<코드>
TypedQuery<Parent> query = em.createQuery("" +
"SELECT p FROM Parent p ORDER BY p.name DESC", Parent.class);
query.setFirstResult(0);
query.setMaxResults(7);
System.out.println(query.getResultList());
<SQL>
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Hibernate: /* SELECT p FROM Parent p ORDER BY p.name DESC */ select parent0_.id as id1_1_, parent0_.name as name2_1_ from Parent parent0_ order by parent0_.name DESC limit ? |
cs |
<결과>
1 2 3 4 5 6 7 |
[Parent{id=8, name='testName8'}, Parent{id=7, name='testName7'}, Parent{id=6, name='testName6'}, Parent{id=5, name='testName5'}, Parent{id=4, name='testName4'}, Parent{id=3, name='testName3'}, Parent{id=2, name='testName2'}] |
cs |
query.setFirstResult(0): 0번째 페이지임을 명시한다.
query.setMaxResult(7): 0번째 페이지에서 7개의 데이터를 가져온다.
데이터 베이스마다 SQL이 다른 것은 물론이고 가장 많이 사용되어지는 오라클의 경우 페이징 쿼리를 따로 공부해야 SQL을 작성할 수 있을 정도로 복잡하다.
만약 페이징처리를 최적화 하고 싶다면 JPA에서 제공하는 API가 아닌 Native Query를 직접 사용해야 한다.
좋아요공감
공유하기
글 요소
구독하기
출처: https://yellowh.tistory.com/130 [노랭이의 공부공간]