[ETC] [Hibernate] 페이징 처리 정리

황제낙엽 2007.02.26 18:34 조회 수 : 457 추천:119

site_link1 http://blog.naver.com/zeon77?Redirect=Lo...0027898151 
site_link2  
site_link3  

  [ 타입1 ]

Query 인터페이스는 페이징 처리를 위한 메소드를 제공하고 있는데, 이 두 메소드는 아래와 같이 사용한다.

 

Query query = session.createQuery("from Member member order by member.name asc"); 
query.setFirstResult(30); 
query.setMaxResults(15); 

Query.setFirstResult() 메소드는 Query의 결과 목록 중에서 읽어올 첫번째 항목의 인덱스값을 입력한다. 이때 인덱스 값은 0부터 시작한다. 따라서, 위 코드는 31번째 항목부터 읽어오게 된다.
setMaxResults() 메소드는 읽어올 최대 개수를 나타낸다. 따라서, 위 코드는 Query 결과의 31번째 항목부터 최대 15개를 읽어오게 된다. 이 두 메소드를 사용하면 페이징 처리를 쉽게 할 수 있을 것이다.
다음과 같은 메서드를 기본적은 구현하여 사용할 수 있습니다.

 

 

·미리보기 | 소스복사·
 
  1. /**  
  2.  * page : 처리를 페이지  
  3.  * range : 화면 당 보여줄 리스트의 갯수  
  4.  */  
  5. protected List  getPagedList(String queryName, int page, int range) throws Exception {   
  6.   Session session = SessionManager.currentSession();   
  7.   /** queryName : 매핑되어 있는 퀴리의 이름명 */  
  8.   Query query = session.getNamedQuery(queryName);   
  9.   /**  (page-1) * range : 설정된 값+1 부터 처리를 시작됨에 유의하자.  */  
  10.   query.setFirstResult((page-1) * range);   
  11.    /** range : 처리하여 가져올 항목의 갯수를 설정하는 부분 */  
  12.   query.setMaxResults(range);   
  13.      
  14.    return query.list();   
  15.  }  

 

 

 



 [ 타입2 ]
보통 SQL을 처리할 때 데이터가 많아질 경우 요구사항이 발생하는 것은 당연합니다.
Hibernate에서도 이와 같은 고민을 해결하기 위해서 다음과 같은 방법을 제시하고 있습니다.

 

 

 

·미리보기 | 소스복사·
 
  1. Query q = s.createFilter( collection, "" );      // the trivial filter   
  2. q.setMaxResults(PAGE_SIZE);   
  3. q.setFirstResult(PAGE_SIZE * pageNumber);   
  4. List page = q.list();  

즉, 먼저 쿼리를 실행한 다음 해당 해당 Collection 데이터를 Filter를 통해서 필요한 데이터만큼만 가져오도록 처리할 수 있다고 Hibernate 문서에서 제시하고 있네요.
지금 이 방법이 정말 쿼리를 실행할 때 특정 부분만 가져오는 것인지 아니면 님이 말한것처럼 모든 데이터를 가져온 다음 특정부분만 가져오도록 구현되고 있는지는 확인해봐야 될거 같습니다.
Hibernate를 사용하면서 발생하는 문제점 해결을 위한 유용한 Tip을 모아 놓은 http://www.hibernate.org/118.html 보시면 도움 많이 되실거 같습니다.
HQL로 가능한 방법은 더 찾아봐야 될거 같습니다.