前台显示每一页数据需要哪些参数?1当前页码;2总页码(由总记录数和每页记录数决定);3当前页的数据。这样就可以确定PageBean需要哪些变量了。
如何查询每一页数据?地址栏传递需要查询的页码。
数据库是如何查询的?setFirstResult((当前页码-1)*每页记录),setMaxResult(每页记录)。
总体的思路?记住分页的关键是获得PageBean对象,向前台传递PageBean对象。如何获得PageBean对象看注释。
PageBean.java
/**
* PageBean类,用于分页
* @author cbl
*
* @param <T>
*/
public class PageBean<T> {
private Integer currentPage; // 当前页数:地址栏传递过来的查询页码
private Integer totalRecord; // 总记录数:总页数/每页记录数,如果有余数,再+1
private Integer totalPage; // 总页数:数据库查询count(*)
private Integer limit; // 每页记录数:自己决定,想多少就多少
private List<T> list; // 每页的数据:需要分页查询,setFirstResult和setMaxResult
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public Integer getTotalRecord() {
return totalRecord;
}
public void setTotalRecord(Integer totalRecord) {
this.totalRecord = totalRecord;
}
public Integer getTotalPage() {
return totalPage;
}
public void setTotalPage(Integer totalPage) {
this.totalPage = totalPage;
}
public Integer getLimit() {
return limit;
}
public void setLimit(Integer limit) {
this.limit = limit;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
}
PageHibernateCallback.java
/**
* 分页callback类
* @author cbl
*
* @param <T>
*/
public class PageHibernateCallback<T> implements HibernateCallback<List<T>> {
private String hql;
private int start;
private int limit;
private Object[] params;
public PageHibernateCallback(String hql, int start, int limit,
Object[] params) {
super();
this.hql = hql;
this.start = start;
this.limit = limit;
this.params = params;
}
@Override
public List<T> doInHibernate(Session session) throws HibernateException {
Query query = session.createQuery(hql);
// 设置参数
if (params != null) {
for (int i=0; i<params.length; i++) {
query.setParameter(i, params[i]);
}
}
query.setFirstResult(start);
query.setMaxResults(limit);
return query.list();
}
}
查询
List<Product> productList = hibernateTemplate.execute(new PageHibernateCallback
<Product>("from Product p where p.categorySecond.category.cid=?",
start, limit, new Object[]{cid}));
分页不简单,关键靠理解。