관리 메뉴

제뉴어리의 모든것

순수 jpa 페이징 처리 본문

Spring Boot

순수 jpa 페이징 처리

제뉴어리맨 2021. 2. 15. 02:39

<참고자료> 자바 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 [노랭이의 공부공간]