janmen的栏目

一个人活着能干自己想干的事,是最重要的; 只有经历了才回深刻,只有思索了才会懂得。

BlogJava 首页 新随笔 联系 聚合 管理
  0 Posts :: 6 Stories :: 0 Comments :: 0 Trackbacks
Hibernate3提供了DetachedCriteria,使得我们可以在Web层构造detachedCriteria,然后调用业务层Bean,进行动态条件查询,根据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改。

分页支持类:

java代码:


package com.javaeye.common.util;

import java.util.List;

publicclass PaginationSupport {

publicfinalstaticint PAGESIZE = 30;

privateint pageSize = PAGESIZE;

privateList items;

privateint totalCount;

privateint[] indexes = newint[0];

privateint startIndex = 0;

public PaginationSupport(List items, int totalCount){
setPageSize(PAGESIZE);
setTotalCount(totalCount);
setItems(items);
setStartIndex(0);
}

public PaginationSupport(List items, int totalCount, int startIndex){
setPageSize(PAGESIZE);
setTotalCount(totalCount);
setItems(items);
setStartIndex(startIndex);
}

public PaginationSupport(List items, int totalCount, int pageSize, int startIndex){
setPageSize(pageSize);
setTotalCount(totalCount);
setItems(items);
setStartIndex(startIndex);
}

publicList getItems(){
return items;
}

publicvoid setItems(List items){
this.items = items;
}

publicint getPageSize(){
return pageSize;
}

publicvoid setPageSize(int pageSize){
this.pageSize = pageSize;
}

publicint getTotalCount(){
return totalCount;
}

publicvoid setTotalCount(int totalCount){
if(totalCount > 0){
this.totalCount = totalCount;
int count = totalCount / pageSize;
if(totalCount % pageSize > 0)
count++;
indexes = newint[count];
for(int i = 0; i < count; i++){
indexes[i] = pageSize * i;
}
}else{
this.totalCount = 0;
}
}

publicint[] getIndexes(){
return indexes;
}

publicvoid setIndexes(int[] indexes){
this.indexes = indexes;
}

publicint getStartIndex(){
return startIndex;
}

publicvoid setStartIndex(int startIndex){
if(totalCount <= 0)
this.startIndex = 0;
elseif(startIndex >= totalCount)
this.startIndex = indexes[indexes.length - 1];
elseif(startIndex < 0)
this.startIndex = 0;
else{
this.startIndex = indexes[startIndex / pageSize];
}
}

publicint getNextIndex(){
int nextIndex = getStartIndex() + pageSize;
if(nextIndex >= totalCount)
return getStartIndex();
else
return nextIndex;
}

publicint getPreviousIndex(){
int previousIndex = getStartIndex() - pageSize;
if(previousIndex < 0)
return0;
else
return previousIndex;
}

}



抽象业务类
java代码:


/**
* Created on 2005-7-12
*/

package com.javaeye.common.business;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.javaeye.common.util.PaginationSupport;

publicabstractclass AbstractManager extends HibernateDaoSupport {

privateboolean cacheQueries = false;

privateString queryCacheRegion;

publicvoid setCacheQueries(boolean cacheQueries){
this.cacheQueries = cacheQueries;
}

publicvoid setQueryCacheRegion(String queryCacheRegion){
this.queryCacheRegion = queryCacheRegion;
}

publicvoid save(finalObject entity){
getHibernateTemplate().save(entity);
}

publicvoid persist(finalObject entity){
getHibernateTemplate().save(entity);
}

publicvoid update(finalObject entity){
getHibernateTemplate().update(entity);
}

publicvoid delete(finalObject entity){
getHibernateTemplate().delete(entity);
}

publicObject load(finalClass entity, finalSerializable id){
return getHibernateTemplate().load(entity, id);
}

publicObject get(finalClass entity, finalSerializable id){
return getHibernateTemplate().get(entity, id);
}

publicList findAll(finalClass entity){
return getHibernateTemplate().find("from " + entity.getName());
}

publicList findByNamedQuery(finalString namedQuery){
return getHibernateTemplate().findByNamedQuery(namedQuery);
}

publicList findByNamedQuery(finalString query, finalObject parameter){
return getHibernateTemplate().findByNamedQuery(query, parameter);
}

publicList findByNamedQuery(finalString query, finalObject[] parameters){
return getHibernateTemplate().findByNamedQuery(query, parameters);
}

publicList find(finalString query){
return getHibernateTemplate().find(query);
}

publicList find(finalString query, finalObject parameter){
return getHibernateTemplate().find(query, parameter);
}

public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria){
return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, 0);
}

public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, finalint startIndex){
return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, startIndex);
}

public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, finalint pageSize,
finalint startIndex){
return(PaginationSupport) getHibernateTemplate().execute(new HibernateCallback(){
publicObject doInHibernate(Session session)throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
criteria.setProjection(null);
List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex);
return ps;
}
}, true);
}

publicList findAllByCriteria(final DetachedCriteria detachedCriteria){
return(List) getHibernateTemplate().execute(new HibernateCallback(){
publicObject doInHibernate(Session session)throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list();
}
}, true);
}

publicint getCountByCriteria(final DetachedCriteria detachedCriteria){
Integer count = (Integer) getHibernateTemplate().execute(new HibernateCallback(){
publicObject doInHibernate(Session session)throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.setProjection(Projections.rowCount()).uniqueResult();
}
}, true);
return count.intValue();
}
}




用户在web层构造查询条件detachedCriteria,和可选的startIndex,调用业务bean的相应findByCriteria方法,返回一个PaginationSupport的实例ps。

ps.getItems()得到已分页好的结果集
ps.getIndexes()得到分页索引的数组
ps.getTotalCount()得到总结果数
ps.getStartIndex()当前分页索引
ps.getNextIndex()下一页索引
ps.getPreviousIndex()上一页索引


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=660484

posted on 2006-12-29 10:22 Janmen 阅读(17) 评论(0)  编辑  收藏