2009-10-21 4 views
8

최대 절전 모드에서 페이징을 구현하려면 어떻게해야합니까? Query 개체에는 setMaxResultssetFirstResult이라는 확실한 방법이 있습니다. 그러나 결과의 전체 페이지 수는 어디에서 확인할 수 있습니까? 결과의 마지막 페이지에 대한 링크를 표시하고 xxx의 200-250과 같은 결과를 인쇄 할 수 있습니까?최대 절전 모드에서 결과 페이징 구현 (총 행 수 얻기)

+1

두 답변에 동의합니다. 또한이 게시물의 구현 사례를 묻습니다. http://stackoverflow.com/questions/1600440/java-coding-best-practices-for-reusing-part-of-a-query-to-count – KLE

답변

12

Query.setMaxResults (int results) 및 Query.setFirstResult (int offset)를 사용할 수 있습니다.

편집 : 얼마나 많은 결과를 얻을지 알 수 없습니다. 먼저 "select count (*) ..."를 사용하여 쿼리해야합니다. 좀 못생긴, IMHO.

1

두 개의 쿼리 - 너무 많은 테이블을 함께 조인하지 않는 경우 비용이 적게 드는 계산 (*) 유형 쿼리와 제한이 설정된 두 번째 쿼리를 수행 할 수 있습니다. 그러면 아이템이 몇 개 있는지 알지만 볼 수있는 아이템 만 가져옵니다.

-2

개인적으로 프론트 엔드에서 페이징을 처리해야한다고 생각합니다. 나는 이것이 효과가 없다는 것을 알고 있지만 적어도 오류가 발생하기 쉽습니다.

count (*)를 사용하면 특정 페이지에 대한 요청 사이에 테이블에서 레코드가 삭제되면 어떻게됩니까? 많은 일이 이런 식으로 잘못 될 수 있습니다.

+0

I 그것이 중요하다고 생각하지 마십시오. 레코드가 삭제 된 ** 및 ** 마지막 페이지를 탐색하면 오류와 함께 기존의 기존 레코드에 대한 링크가 표시됩니다. 아니면 비슷한. – flybywire

+3

데이터 양이 엄청나게 많아지면 프런트 엔드에서 페이징 문제가 발생합니다 (예 : 1 백만 레코드 등). – Chii

7

최대 결과를 얻으려면 별도의 쿼리를 수행해야하며, 다른 요청이 발행 될 때 클라이언트가 시간 B에 페이징 요청을 처음 발행 한 시간 A에서 새 레코드가 추가 된 경우 또는 일부 레코드가 이제 기준에 맞으면 최대를 다시 쿼리하여이를 반영해야합니다. 나는 보통 당신은 최대 행 수 단지는 setMaxResults 반환하려는 수있는이

ScrollableResults scrollable = criteria.scroll(ScrollMode.SCROLL_INSENSITIVE); 
if(scrollable.last()){//returns true if there is a resultset 
    genericDTO.setTotalCount(scrollable.getRowNumber() + 1); 
    criteria.setFirstResult(command.getStart()) 
      .setMaxResults(command.getLimit()); 
    genericDTO.setLineItems(Collections.unmodifiableList(criteria.list())); 
} 
scrollable.close(); 
return genericDTO; 
0

같은 DTO에 내 데이터를 밀어 Criteria 쿼리에 대해 나는 보통이

Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult(); 

같은 HQL에서이 작업을 수행. 이 값을 사용 가능한 실제 행 수보다 크게 설정해도 아무런 해가 없습니다. 다른 솔루션의 문제점은 레코드의 순서가 쿼리의 반복마다 동일하고 명령간에 변경이 없다고 가정하는 것입니다.

실제로 결과를 스크롤하려면 ScrollableResults를 사용하는 것이 가장 좋습니다. 이 오브젝트를 페이징 사이에 버리지 말고 레코드를 동일한 순서로 유지하는 데 사용하십시오. ScrollableResults에서 레코드 수를 찾으려면 last() 위치로 이동 한 다음 행 번호를 가져옵니다. 행 번호는 0부터 계산되기 때문에이 값에 1을 더해야합니다.

관련 문제