应用Hibernate3的DetachedCriteria实现分页查询

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

分页支持类:

java代码:


package com. javaeye. common. util;

import java. util. List;

public class PaginationSupport {

public final static int PAGESIZE = 30;

private int pageSize = PAGESIZE;

private List items;

private int totalCount;

private int [ ] indexes = new int [ 0 ];

private int 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 );
}

public List getItems ( ) {
return items;
}

public void setItems ( List items ) {
this. items = items;
}

public int getPageSize ( ) {
return pageSize;
}

public void setPageSize ( int pageSize ) {
this. pageSize = pageSize;
}

public int getTotalCount ( ) {
return totalCount;
}

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

public int [ ] getIndexes ( ) {
return indexes;
}

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

public int getStartIndex ( ) {
return startIndex;
}

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

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

public int getPreviousIndex ( ) {
int previousIndex = getStartIndex ( ) - pageSize;
if (previousIndex < 0 )
return 0;
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;

public abstract class AbstractManager extends HibernateDaoSupport {

private boolean cacheQueries = false;

private String queryCacheRegion;

public void setCacheQueries ( boolean cacheQueries ) {
this. cacheQueries = cacheQueries;
}

public void setQueryCacheRegion ( String queryCacheRegion ) {
this. queryCacheRegion = queryCacheRegion;
}

public void save ( final Object entity ) {
getHibernateTemplate ( ). save (entity );
}

public void persist ( final Object entity ) {
getHibernateTemplate ( ). save (entity );
}

public void update ( final Object entity ) {
getHibernateTemplate ( ). update (entity );
}

public void delete ( final Object entity ) {
getHibernateTemplate ( ). delete (entity );
}

public Object load ( final Class entity, final Serializable id ) {
return getHibernateTemplate ( ). load (entity, id );
}

public Object get ( final Class entity, final Serializable id ) {
return getHibernateTemplate ( ). get (entity, id );
}

public List findAll ( final Class entity ) {
return getHibernateTemplate ( ). find ( "from " + entity. getName ( ) );
}

public List findByNamedQuery ( final String namedQuery ) {
return getHibernateTemplate ( ). findByNamedQuery (namedQuery );
}

public List findByNamedQuery ( final String query, final Object parameter ) {
return getHibernateTemplate ( ). findByNamedQuery (query, parameter );
}

public List findByNamedQuery ( final String query, final Object [ ] parameters ) {
return getHibernateTemplate ( ). findByNamedQuery (query, parameters );
}

public List find ( final String query ) {
return getHibernateTemplate ( ). find (query );
}

public List find ( final String query, final Object parameter ) {
return getHibernateTemplate ( ). find (query, parameter );
}

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

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

public PaginationSupport findPageByCriteria ( final DetachedCriteria detachedCriteria, final int pageSize,
final int startIndex ) {
return (PaginationSupport ) getHibernateTemplate ( ). execute ( new HibernateCallback ( ) {
public Object 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 );
}

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

public int getCountByCriteria ( final DetachedCriteria detachedCriteria ) {
Integer count = ( Integer ) getHibernateTemplate ( ). execute ( new HibernateCallback ( ) {
public Object 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()上一页索引
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值