예:
20,000번째 레코드부터 100개의 레코드 검색
코드:
Query q = session.createQuery("from Cat as c");
q.setFirstResult (20000);
q.setMaxResults(100);
List l = q.list();
그러면 Hibernate의 최하위 계층은 어떻게 페이징을 구현합니까? 실제로 Hibernate의 쿼리는 net.sf.hibernate.loader.Loader 클래스에 정의되어 있습니다. 이 클래스의 코드를 주의 깊게 읽어보면 문제를 완전히 이해할 수 있습니다.
Hibernate2.0.3의 Loader 소스 코드 480번째 줄은 다음과 같습니다.
코드:
if (useLimit) sql = Dialect.getLimitString(sql)
ReadyStatement st; = session.getBatcher().prepareQueryStatement(sql,
scrollable);
해당 데이터베이스에서 쿼리 레코드를 제한하는 sql 문을 정의하는 경우 해당 데이터베이스의 sql 문을 직접 사용하세요. StringBuffer pagingSelect = new StringBuffer(100);
pagingSelect.append(sql);
pagingSelect.append(" 제한 ?, ?");
pagingSelect를 반환합니다. toString (); {
return true;
public String getLimitString(String sql) {
StringBuffer pagingSelect = new StringBuffer(100);
row_.*, rownum rownum_
from ( ") ;
pagingSelect.append(sql);
pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");
return pagingSelect.toString(); 레이어의 쿼리 문은 정렬 기준을 지원할 수 없습니다.
이외에도 Interbase, PostgreSQL, HSQL도 Paging SQL 문을 지원하며 해당 Dialect에서 참고할 수 있습니다.
데이터베이스가 페이징 SQL 문을 지원하지 않으면 구성 파일의 #hibernate.jdbc.use_scrollable_resultset true에 따라 false를 지정하지 않으면 Hibernate는 스크롤 가능 결과를 사용합니다. JDBC2.0에서 페이지 매김을 구현하려면 Loader의 다음 430행을 살펴보세요.
코드:
if ( session.getFactory().useScrollableResultSets() ) {
// 할 수 있습니다. 첫 번째 필수 행으로 바로 이동
rs.absolute(firstRow);
}
else {
// 한 번에 한 행씩 진행해야 합니다(느림)
for ( int m=0; m
스크롤 가능한 결과를 지원하는 경우 ResultSet의 절대 메소드를 사용하여 쿼리 시작점으로 직접 이동 그렇지 않은 경우 루프 문과 rs.next를 사용하여 비트 단위로 이동합니다.
Hibernate를 사용하면 쿼리 및 페이징 작업에 큰 유연성이 있음을 알 수 있습니다. Hibernate는 먼저 특정 데이터베이스의 페이징 SQL을 사용하려고 시도하고 작동하지 않으면 Scrollable을 시도합니다. 마지막으로 rset.next() 이동 방법을 사용합니다.
쿼리 페이징 코드에서 Hibernate를 사용하는 가장 큰 이점 중 하나는 쿼리 페이징 성능을 고려할 뿐만 아니라 서로 다른 데이터베이스 간의 코드 이식성을 보장한다는 것입니다.