【IT168 技术文档】
分页有2种办法:
1、从数据库中取得记录,在内存中再划分,如果遇到记录数很大的时候效率很成问题,此法不可取。
2、采用hibernate的物理分页,每次只是取一页。从客户端传进来的是第几页和每页多少条记录,要首先查询符合记录的总记录数,再根据总记录数和当前页,每页记录数可以算出要取的是数据库中的第几条记录。2次查询不可避免了。
单元测试如下:public final void testFindAllRole() {
- logger.debug("testFindAllRole");
- long l1=System.currentTimeMillis();
- String myaction="roleList.do";
- String curPageNO = "1";
- CriteriaQuery cq=new CriteriaQuery(Role.class,curPageNO,myaction);
- cq.setPageSize(10);
- PageSupport ps=BeanFactory.getInstance().getRightDelegate().findAllRole(cq, state);
- long l2=System.currentTimeMillis();
- AppUtils.printCollection(ps.getResultList());
- System.out.println("一共用时为 : "+(l2-l1));
- }
CriteriaQuery类是对hibernate QBC查询方法的封装,需要的参数是当前操作的实体类,myaction,curPageNO,pageSize,以便构造出相应的上下翻页的工具条。
在delegate中只是将值向下传:
java 代码- public PageSupport findAllRole(CriteriaQuery cq, IState state) {
- if (DelegateUtil.isNullParam(cq, "CriteriaQuery", state)) {
- return null;
- }
- Request req = new Request();
- req.setServiceName(ServiceConsts.FindAllRoleProcessor);
- req.setValue("CriteriaQuery", cq);
- try {
- Response resp = getDelegate().execute(req);
- DelegateUtil.setIState(state, resp);
- return (PageSupport) (resp.getValue("PageSupport"));
- } catch (Exception e) {
- DelegateUtil.handleException(e, "findAllRole", state);
- }
- return new PageSupport();
- }
在业务逻辑模块command中:
java 代码- public class FindAllRole extends Command
- {
- private RoleDao dao;
- public void setDao(RoleDao dao) {
- this.dao = dao;
- }
- public void execute(Map params, Map response) throws Exception
- {
- response.put("PageSupport", (PageSupport)dao.find((CriteriaQuery) params.get("CriteriaQuery"),true));
- }
- ……
- }
java 代码- public PageSupport find(final CriteriaQuery cq,final boolean isOffset) {
- return (PageSupport)getHibernateTemplate().execute(
- new HibernateCallback() {
- public Object doInHibernate(Session session) throws HibernateException, SQLException {
- Criteria criteria = cq.getDetachedCriteria().getExecutableCriteria(session);
- //得到总行数
- int allCounts = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
- criteria.setProjection(null);//还原
- int curPageNO = PagerUtil.getCurPageNO(cq.getCurPage());// 当前页
- int offset = PagerUtil.getOffset(allCounts, curPageNO, cq.getPageSize());
- String toolBar = PagerUtil.getBar(cq.getMyaction(),allCounts,curPageNO,cq.getPageSize());
- if(isOffset){
- criteria.setFirstResult(offset);
- criteria.setMaxResults(cq.getPageSize());
- }
- return new PageSupport(criteria.list(),toolBar,offset,curPageNO);
- }
- }
- ,true);
- }
在后台的整个操作中非常简练,只需要将带上参数的CriteriaQuery传到dao就可以实现。CriteriaQuery封装了hibernate的DetachedCriteria。