最优化最灵活的Hibernate分页_hql实现

来源:互联网 发布:拍卖房地产司法数据 编辑:程序博客网 时间:2024/06/08 03:07
 

page.java(全类代码)

package com.yongle.web.utils;

import java.util.ArrayList;
import java.util.List;

@SuppressWarnings("unused")

public class Page {

private int pageCount ;// 总页数
private int pageSize ;// 每页记录数
private int currentPage ;// 当前页数
private int firstRecord ; // 从第几条开始
private int recordCount ; // 总记录数
private String hql;// 查询的hql
private List<Object> params;// 查询的条件
private List list = new ArrayList();// 查询的结果
private String url;// 查询的条件
private String pageStr;// 分页的标签

public String getPageStr() {//用来生成翻页的工具条
   String pageCount_="&pageCount="+pageCount;
   String currentPage_="&currentPage=";
   String url_=url+pageCount_+currentPage_;
  
   StringBuffer sb=new StringBuffer();
   if(pageCount<currentPage)return null;
   if (currentPage==1) {
    sb.append("<span class='disabled'>&lt;&lt;首页</span>&nbsp;<span class='disabled'>&nbsp;&lt;&lt;上一页</span>");
   } else {
    sb.append("<a href='"+ url_ +"1'>&lt;&lt;首页</a><a href='"+ url_ +(currentPage-1)+"'>&nbsp;&lt;&lt;上一页</a>");
   }
   if((currentPage-3)>0 ) sb.append("<a href='"+ url_ +(currentPage-3)+"'>&nbsp;"+(currentPage-3)+"</a>");
   if((currentPage-2)>0 ) sb.append("<a href='"+ url_ +(currentPage-2)+"'>&nbsp;"+(currentPage-2)+"</a>");
   if((currentPage-1)>0 ) sb.append("<a href='"+ url_ +(currentPage-1)+"'>&nbsp;"+(currentPage-1)+"</a>");
   
   sb.append("<span class='current'>&nbsp;"+currentPage+"</span>");
  
   if((pageCount-currentPage)>0 ) sb.append("<a href='"+ url_ +(currentPage+1)+"'>&nbsp;"+(currentPage+1)+"</a>");
   if((pageCount-currentPage)>1 ) sb.append("<a href='"+ url_ +(currentPage+2)+"'>&nbsp;"+(currentPage+2)+"</a>");
   if((pageCount-currentPage)>2 ) sb.append("<a href='"+ url_ +(currentPage+3)+"'>&nbsp;"+(currentPage+3)+"</a>");
  
   if (pageCount == currentPage) {
    sb.append("<span class='disabled'>&nbsp;下一页&gt;&gt;</span><span class='disabled'>&nbsp;末页&gt;&gt;</span>");
   } else {
    sb.append("<a href='"+ url_ +(currentPage+1)+"'>&nbsp;下一页&gt;&gt;</a><a href='"+ url_ +(pageCount)+"'>&nbsp;末页&gt;&gt;</a>");
   }
   //System.out.println(sb.toString());
   return sb.toString();
}

public void setPageStr(String pageStr) {
   this.pageStr = pageStr;
}

public int getPageCount() {
   return pageCount;
}

public void setPageCount(int pageCount) {
   this.pageCount = pageCount;
}

public int getPageSize() {
   return pageSize;
}

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

public int getCurrentPage() {
  
   return(this.currentPage==0)?1:this.currentPage;
}

public void setCurrentPage(int currentPage) {
   this.currentPage = currentPage;
}

// 当前开始位置为(当前页-1)*每页记录数
public int getFirstRecord() {
   currentPage=(currentPage==0)?1:currentPage;
   return (currentPage - 1) * pageSize;
}

public void setFirstRecord(int firstRecord) {
   this.firstRecord = firstRecord;
}

public String getHql() {
   return hql;
}

public void setHql(String hql) {
   this.hql = hql;
}

public List<Object> getListQuery() {
   return params;
}

public void setListQuery(List<Object> params) {
   this.params = params;
}

public List getList() {
   return list;
}

public void setList(List list) {
   this.list = list;
}

public int getRecordCount() {
   return recordCount;
}

public void setRecordCount(int recordCount) {
   this.recordCount = recordCount;
}
public List<Object> getParams() {
   return params;
}
public void setParams(List<Object> params) {
   this.params = params;
}

public String getUrl() {
   return url;
}

public void setUrl(String url) {
   this.url = url;
}

}

dao实现(两个方法共同完成实现)

    /**
* 分页查询(hql分页)方法代码
*/
@SuppressWarnings("unchecked")

public   Page findByPage( Page page) {

   int currentpage = page.getCurrentPage(); // 获得当前页
   int pagesize = page.getPageSize(); // 每页的条数
   int firstrecord = page.getFirstRecord(); // 从第几条开始
   int recordcount = page.getRecordCount(); // 获得记录总数
   int pagecount = page.getPageCount(); // 总页数
   List<Object> params = page.getListQuery();// 查询的条件集合
   String hql = page.getHql();
   List ls = new ArrayList();// 查询结果集合
  
   Session session = this.getSession();
  
//
   if (currentpage == 1) {//第一页是查询总条数和计算页数

    String counthql = hql.substring(hql.toLowerCase().lastIndexOf("from"));

    counthql = "select count(*) " + counthql;
    // 创建查询并设置查询缓存
    Query query = session.createQuery(counthql).setCacheable(true);
   
    for (int i = 0; i < params.size(); i++) {
     query.setParameter(i, params.get(i), Hibernate.LOCALE);
    }
    // 获得记录总数
    recordcount = Integer.parseInt(query.list().get(0).toString());
    // 算出总共有多少页
    if (recordcount % pagesize == 0) {
     pagecount = recordcount / pagesize;
    } else {
     pagecount = recordcount / pagesize + 1;
    }
   }
  
   //查询数据
   ls = findByPageHelper(session,hql, params, firstrecord, pagesize);

   page.setPageCount(pagecount);// 总页数
   page.setRecordCount(recordcount);// 总记录数
   page.setList(ls);// 结果集合

   return page;
}

/**
* 分页查询辅助类
*
* @param hql
*            查询语句
* @param params
*            查询参数
* @param firstrecord
*            从第几条开始
* @param pagesize
*            取多少条
* @return 查询结果集
*/
public List<?> findByPageHelper(Session session, String hql, List<Object> params,
    int firstrecord, int pagesize) {

   Query query = session.createQuery(hql);
   query.setCacheable(true);// 设置缓存
   for (int i = 0; i < params.size(); i++) {
   query.setParameter(i, params.get(i), Hibernate.LOCALE);
   }
  
   query.setFirstResult(firstrecord);
   query.setMaxResults(pagesize);
   List<?> list=query.list();
   session.close();
   return list;

}

action调用代码(struts2.0代码)price,played 均已得到

public String findOrder() {
  
   List<Object> params = new ArrayList<Object>();
   String strUrl=request.getContextPath()+"/yaohao/findOrder.action?price="+price+"&played="+played;
        
        String queryString = " from TComm t where t.played=? and t.prices=? and t.yaohao=1 order by id desc" ;
         params.add(played);
         params.add(price);
       
   page.setCurrentPage(currentPage);
   page.setPageCount(pageCount);
   page.setHql(queryString);
   page.setPageSize(10);
   page.setUrl(strUrl);
   page.setListQuery(params);
   page = commDAO.findByPage(page);
//   System.out.println(page.getList().size());
  
   return "getListOk";
}

页面展示代码:

    <table width="912" cellpadding="0" cellspacing="0" bordercolor="#9DBFD6" class="table_css_1 line18">
     <tr class="table_title_1">
     <td width="97" height="25">订单号</td>
     <td width="181">订单时间</td>
     <td width="278">比赛名称</td>
     <td width="172">比赛时间</td>
       <td width="109">姓名</td>
       <td width="73">数量</td>
        </tr>
     <c:forEach var="t" items="${page.list}">
      <tr align="center">
      <td>${t.id }</td>
      <td><fmt:formatDate value="${t.createdate}" type="both"/></td>
      <td>${t.description }</td>
      <td>${t.played }</td>
        <td>${t.truename }</td>
        <td>${t.ticketpiece }</td>
         </tr>
                </c:forEach>
     <tr class="table_title_1">
    <td colspan="6">${page.pageStr}</td><!-- 分页工具条已经自动生成,这里只需要取出即可 -->
        </tr>
      </table>

转载自:http://hi.baidu.com/dreamtop2010/blog/item/174387ee5dcee0cb2f2e21f0.html
原创粉丝点击