Hibernate 3 를 사용 하여 페이지 기능 구현
http://blog.csdn.net/zhjb1025/archive/2006/04/19/668631.aspx
정 리 된 코드 는 다음 과 같 습 니 다.
페이지Java인터페이스
packageorg.domain.scrm4u.helper;
importjava.util.List;
publicinterfacePage{
booleanisFirstPage();
booleanisLastPage();
booleanhasNextPage();
booleanhASPreviousPage();
intgetLastPageNumber();
List<?>getThisPageElements();
intgetTotalNumberOfElements();
intgetThisPageFirstElementNumber();
intgetThisPageLastElementNumber();
intgetNextPageNumber();
intgetPreviousPageNumber();
intgetPageSize();
intgetPageNumber();
}
ListPage.java 구현:
packageorg.domain.scrm4u.helper.impl;
importjava.util.List;
importorg.domain.scrm4u.helper.Page;
publicclassListPageimplementsPage{
privateList<?>elements;
privateintpageSize;
privateintpageNumber;
publicListPage(List<?>elements,intpageNumber,intpageSize){
this.elements=elements;
this.pageSize=pageSize;
this.pageNumber=pageNumber;
if(Integer.MAX_VALUE==this.pageNumber)this.pageNumber=(getTotalNumberOfElements()/this.pageSize);
}
publicbooleanisFirstPage(){
returngetPageNumber()==0;
}
publicbooleanisLastPage(){
returngetPageNumber()>=getLastPageNumber();
}
publicbooleanhasNextPage(){
return((getPageNumber()+1)*getPageSize())<(getTotalNumberOfElements()+1);
}
publicbooleanhasPreviousPage(){
returngetPageNumber()>0;
}
publicintgetLastPageNumber(){
doubletotalResults=newInteger(getTotalNumberOfElements()).doubleValue();
returnnewDouble(Math.floor(totalResults/getPageSize())).intValue();
}
publicList<?>getThisPageElements(){
finalintstart=getPageNumber()*getPageSize();
returnelements.subList(
Math.min(start,getTotalNumberOfElements()+1),
Math.min(start+getPageSize(),getTotalNumberOfElements()+1)
);
}
publicintgetTotalNumberOfElements(){
returnelements.size()-1;
}
publicintgetThisPageFirstElementNumber(){
returngetPageNumber()*getPageSize()+1;
}
publicintgetThisPageLastElementNumber(){
intfullPage=getThisPageFirstElementNumber()+getPageSize()-1;
returngetTotalNumberOfElements()<fullPage?getTotalNumberOfElements():fullPage;
}
publicintgetNextPageNumber(){
returngetPageNumber()+1;
}
publicintgetPreviousPageNumber(){
returngetPageNumber()-1;
}
publicintgetPageSize(){
returnpageSize;
}
publicintgetPageNumber(){
returnpageNumber;
}
}
HibernatePage.Java실현:
packageorg.domain.scrm4u.helper.impl;
importjava.util.List;
importorg.domain.scrm4u.helper.Page;
importorg.hibernate.HibernateException;
importorg.hibernate.Query;
importorg.hibernate.ScrollMode;
importorg.hibernate.ScrollableResults;
publicclassHibernatePageimplementsPage{
protectedList<?>elements;
protectedintpageSize;
protectedintpageNumber;
protectedinttotalElements=0;
privateScrollableResultsscrollableResults;
privateHibernatePage(intpageNumber,intpageSize){
this.pageNumber=pageNumber;
this.pageSize=pageSize;
}
publicbooleanisFirstPage(){
returngetPageNumber()==0;
}
publicbooleanisLastPage(){
returngetPageNumber()>=getLastPageNumber();
}
publicbooleanhasNextPage(){
returnelements.size()>getPageSize();
}
publicbooleanhASPreviousPage(){
returngetPageNumber()>0;
}
publicintgetLastPageNumber(){
doubletotalResults=newInteger(getTotalNumberOfElements()).doubleValue();
returnnewDouble(Math.floor(totalResults/getPageSize())).intValue();
}
publicList<?>getThisPageElements(){
returnhasNextPage()?elements.subList(0,getPageSize()):elements;
}
publicintgetTotalNumberOfElements(){
returntotalElements;
}
publicintgetThisPageFirstElementNumber(){
returngetPageNumber()*getPageSize()+1;
}
publicintgetThisPageLastElementNumber(){
intfullPage=getThisPageFirstElementNumber()+getPageSize()-1;
returngetTotalNumberOfElements()<fullPage?getTotalNumberOfElements():fullPage;
}
publicintgetNextPageNumber(){
returngetPageNumber()+1;
}
publicintgetPreviousPageNumber(){
returngetPageNumber()-1;
}
publicintgetPageSize(){
returnpageSize;
}
publicintgetPageNumber(){
returnpageNumber;
}
publicstaticHibernatePagegetScrollPage(Queryquery,intpageNumber,intpageSize,ScrollModescrollMode){
HibernatePagesp=newHibernatePage(pageNumber,pageSize);
try{
sp.scrollableResults=query.scroll(scrollMode);
if(scrollMode==ScrollMode.SCROLL_SENSITIVE){
sp.scrollableResults.last();
sp.totalElements=sp.scrollableResults.getRowNumber();
}else{
sp.totalElements=sp.calculateTotalElementsByList(query);
}
sp.determineElements(query);
}catch(HibernateExceptione){
e.printStackTrace();
}
returnsp;
}
privatevoiddetermineElements(Queryquery)throwsHibernateException{
if(Integer.MAX_VALUE==this.pageNumber)this.pageNumber=(getTotalNumberOfElements()/this.pageSize);
elements=query.setFirstResult(this.pageNumber*this.pageSize).setMaxResults(this.pageSize+1).list();
}
privateintcalculateTotalElementsByList(Queryquery)throwsHibernateException{
returnquery.list().size();
}
}
간단하게 분석 해 보 세 요.
ListPage 구현 은 검색 결과 집합 을 모두 꺼 내야 합 니 다.
우 리 는 페이지 의 실현 을 분석 하 는 데 중심 을 두 었 다.
테스트 코드 는 다음 과 같 습 니 다:
importJava.io.IOException;
importjava.sql.SQLException;
importjava.util.List;
importorg.hibernate.Query;
importorg.hibernate.ScrollMode;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.AnnotationConfiguration;
importorg.hibernate.cfg.Configuration;
importorg.domain.scrm4u.helper.Page;
importorg.domain.scrm4u.helper.impl.HibernatePage;
importorg.domain.scrm4u.entity.TPsn;
publicclassBusinessService{
publicstaticvoidmain(String[]args)throwsIOException,SQLException{
Configurationconfig= newAnnotationConfiguration().configure();
SessionFactorysessionFactory=config.buildSessionFactory();
Sessionsession=sessionFactory.openSession();
StringHql="fromTPsn";
Queryquery=session.createQuery(Hql);
Pagepage=HibernatePage.getScrollPage(query,0,10,ScrollMode.SCROLL_SENSITIVE);
List<?>list=page.getThisPageElements();
for(inti=0;i<list.size();i++){
TPsnpsn=(TPsn)list.get(i);
System.out.println(psn.getPsnNo()+"t"+psn.getPsnPnm()+"t"+psn.getPsnBrthDt());
}
session.close();
sessionFactory.close();
}
}
테스트 중 발견:
ScrollMode.Scroll 사용 하기SENSITIVE 비 Scrollmode.FORWARDONLY 는 성능 면 에서 훨씬 빠르다.구체 적 인 선택 은 사용 할HibernateJDBC이 지탱 되 었 는 지,scroll 을 지원 하면 ScrollableResults 류 를 사용 하여 결과 집합 을 처리 할 수 있 습 니 다.
물론 캐 시 기술 에 맞 춰 페이지 를 넘 기 는 것 도 효율 적 이다.
캐 시 에 대해 서 는 참고 하 시기 바 랍 니 다.http://blog.csdn 구동 하 다 /kunshan_shenbin/archive/2008/09/03/2874992. .net x。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JPA] 즉시로딩(EAGER)과 지연로딩(LAZY) (왜 LAZY 로딩을 써야할까?) (1)Proxy는 이 글의 주제인 즉시로딩과 지연로딩을 구현하는데 중요한 개념인데, 일단 원리는 미뤄두고 즉시로딩과 지연로딩이 무엇인지에 대해 먼저 알아보자. 눈 여겨 볼 곳은 'fetch = FetchType.EAGER...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.