복붙노트

[SPRING] 숫자와 다음, 이전의 Jpa 페이징

SPRING

숫자와 다음, 이전의 Jpa 페이징

나는 누군가가 이미 질문하고 어쩌면 멍청한 질문을하는 것에 대해이 질문을 한 것에 대해 사과드립니다. 그러나 저는이 문제에 익숙하지 않고 당신은 전문가이고 당신의 전문가 조언과 경험을 통해 배우고 싶습니다.

페이지 당 200 개의 레코드를 표시하는 응용 프로그램에 페이징을 추가하려고합니다. 페이지 하단에는 숫자가 있어야합니다. 1050이면 첫 번째 페이지에 100이 표시되고 페이지 하단에는 1,2,3,4,5 및 6이 표시됩니다.

이것을 달성하기위한 일반적인 논리는 무엇입니까? 나는 데이터베이스가 매번 200을 선택해야하며 첫 번째 기록을 추적해야한다는 것을 알고 있습니다.

해결법

  1. ==============================

    1.JPA Criteria API를 사용하여이를 수행 할 수 있습니다. TypedQuery를 가정하면 setFirstResult 및 setLastResult를 사용하여 데이터베이스에서 반환 된 레코드를 제한 할 수 있습니다. 물론이 메소드의 값은 요청한 페이지와 페이지 당 표시되는 레코드 수에 따라 달라집니다.

    JPA Criteria API를 사용하여이를 수행 할 수 있습니다. TypedQuery를 가정하면 setFirstResult 및 setLastResult를 사용하여 데이터베이스에서 반환 된 레코드를 제한 할 수 있습니다. 물론이 메소드의 값은 요청한 페이지와 페이지 당 표시되는 레코드 수에 따라 달라집니다.

    first = (page - 1) * page size;
    last = (page * size) - 1;
    

    주 : 이것은 첫 x ​​째 페이지가 1 (0과 반대) 인 것으로 가정합니다.

    레코드 수를 얻으려면 표준 조건 쿼리를 실행합니다. 예로서:

    final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    final CriteriaQuery<Long> countQuery = builder.createQuery(Long.class);
    countQuery.select(builder.count(countQuery.from(MyEntity.class)));
    final Long count = entityManager.createQuery(countQuery)
            .getSingleResult();
    

    위의 코드를 사용자 정의하여 다른 쿼리와 관련된 카운트를 수행 할 수도 있습니다. 마지막으로, 총 카운트를 다시 클라이언트에 알리는 방법이 필요합니다. 이 작업을 수행하는 한 가지 방법은 쿼리의 결과 집합을 개수에 대한 특성을 포함하는 다른 개체로 래핑하거나 DAO 호출의 결과로 반환하는 것입니다. 또는 요청 범위의 개체에 count 특성을 저장할 수 있습니다.

    public class ResultListWrapper<T> {
        private Long count;
        private Collection<T> results;
    
        // constructor, getters, setters
    }
    
  2. ==============================

    2.일반적으로 실제 쿼리를 실행하기 이전에 열 대신 select 목록을 count int를 사용하여 몇 개의 페이지가 있는지 찾아 보는 것을 제외하고는 동일한 쿼리를 수행합니다. 최대 절전 모드에서 특정 페이지를 얻는 것은 다음과 같이 할 수있다.

    일반적으로 실제 쿼리를 실행하기 이전에 열 대신 select 목록을 count int를 사용하여 몇 개의 페이지가 있는지 찾아 보는 것을 제외하고는 동일한 쿼리를 수행합니다. 최대 절전 모드에서 특정 페이지를 얻는 것은 다음과 같이 할 수있다.

    int maxRecords = // page size ...
    int startRow = // page number * page size
    Query query = session.createQuery('...');
    query.setMaxResults(maxRecords);
    query.setFirstResult(startRow);
    

    추가 쿼리를 수행하는 데 비용이 너무 많이 든다면 다음 / 이전 링크를 제공하거나 필요에 따라 여분의 페이지를 제공하는 것만으로 고려할 수 있습니다 (예 :로드 된 데이터의 마지막 부분이 아약스를 통해 표시됨).

    페이지 번호 링크를 포함하여 페이지 된 결과를 표시하려면 표시 태그 JSP 태그 라이브러리를 사용하여 jsp 페이지를 사용하여이 데이터를 표시한다고 가정하십시오. 표시 태그는 JSP로 가져올 수 있다고 가정하여 표 형식 데이터의 페이지 표시 및 정렬을 처리합니다.

  3. ==============================

    3.예, 행을 직접 가져 오기 전에 선택 개수를 수행해야합니다.

    예, 행을 직접 가져 오기 전에 선택 개수를 수행해야합니다.

  4. ==============================

    4.Spring Data JPA를 살펴 보자. 그것은 기본적으로 Perception이 일찍이 제안했던 방식으로 작동합니다. 단지 프레임 워크가 당신을 대신 할 필요가 없다는 것입니다. 기본적으로 페이징 및 정렬을 수행합니다 (Query DSL을 사용하지 않으려는 경우 여전히 필터링을 수행해야합니다).

    Spring Data JPA를 살펴 보자. 그것은 기본적으로 Perception이 일찍이 제안했던 방식으로 작동합니다. 단지 프레임 워크가 당신을 대신 할 필요가 없다는 것입니다. 기본적으로 페이징 및 정렬을 수행합니다 (Query DSL을 사용하지 않으려는 경우 여전히 필터링을 수행해야합니다).

    그들은 메인 페이지에 1 시간 분량의 비디오를 보여 주지만, ID가 무엇인지에 대한 아이디어를 얻으려면 약 15 분만 시청하면됩니다.

  5. from https://stackoverflow.com/questions/10144487/jpa-paging-with-numbers-and-next-previous by cc-by-sa and MIT license