如果只是hibernate分页很简单。
Query q = session.createQuery("from Cat as c");
q.setFirstResult(20000);
q.setMaxResults(100);
List l = q.list();
Query q = session.createQuery("from Cat as c");
q.setFirstResult(20000);
q.setMaxResults(100);
List l = q.list();
解决方案 »
- request.getParameter获取中文是乱码
- struts2中怎样实现过滤jsp页面的过滤器?
- form提交action无法get到值,没分了请包涵
- 求HttpSessionBindingListener的具体使用代码
- 严重: Exception starting filter struts2问题
- 一个简单的概念问题
- 怎样使double类型的值只取小数点后两位??不使用字符串截取方法??如33.333333333333336取为0.33,而0.3取为0.30??在线等!
- ____________初学者,对java分类的一点问题,谢谢
- 谁有j2sdk-1_4_2_06-windows-i586-p.exe
- EJB的finder问题.
- STRUTS问题,加了Label是不是要在Form Bean里加字段.
- 谁用过DB映射生成Java对象方面的工具,推荐一下
我是想要一个项目中,能用的上的,通用的分页程序.例如返回值可以是一个类:
public class PageForm { private Integer totalPages = 0 ; //总页数
private Integer currentPage = 0; //当前页
private Integer nextPage = 0; //下一页
private Integer prePage = 0; //上一页
private Integer totalRows = 0; //总共多少条记录
private List list ; //返回的数据列表
private Integer pageSize = 0;//每页显示多少条记录
set get 方法略
}
传入查询条件,和查询的条件,及要显示的页数,就可以得到以上一个类,调用起来就非常方便了.
我自己写了一个,但总觉得不是很满意
http://study.pay500.com/3/s32364.htm
有没有其它的呢?
Query q = session.createQuery("from Cat as c");
q.setFirstResult(20000);
q.setMaxResults(100);
List l = q.list(); 封装在楼主的PageForm 类中
我肯定知道封装在 pageForm类中啦! 只是想找一个相对通用,但效率又比较高的方法而已
q.setFirstResult(20000);
q.setMaxResults(100);
List l = q.list();
在这个方法中,把pageform中作为参数传入,然后替换一下Query q = session.createQuery("from Cat as c");
q.setFirstResult(pageform.getcurrentPage()*pageform.getpageSize() );
q.setMaxResults(.....);
List l = q.list();
这样就可以只提取数据库中局你指定页码的数据到list中,提高性能
import org.hibernate.Query;
import org.hibernate.Session;
import com.sp.pojo.dao._RootDAO;public class SplitPages extends _RootDAO {
private int pageNum;//总页数;
private String curPage;//当前页;
public String getCurPage() {
return curPage;
}
public int getPageNum() {
return pageNum;
}
public SplitPages() {
SplitPages.initialize();
}
public SplitPages(Session session) {
super(session);
}
protected Class getReferenceClass() {
return null;
}
public void splitPages(String pageId,String hql)//pageId:到查第几页;hql:select count(*) from XXXPOJO
{
if(Tool.isEmp(pageId)||"1".equals(pageId))
{
pageId="0";
}
Session sess = super.getSession();
Query query = sess.createQuery(hql);
List countList = query.list();
sess.close();
Integer rows = (Integer)countList.get(0);
this.pageNum = ((rows + 10) - 1) / 10;
this.curPage=(pageId.equals("0")?"1":pageId);
}
}
mport java.util.List;/**
* @author netfishx
*/
public class PageForm { private Integer totalPages = 0 ; //总页数
private Integer currentPage = 0; //当前页
private Integer nextPage = 0; //下一页
private Integer prePage = 0; //上一页
private Integer totalRows = 0; //总共多少条记录
private List list ; //返回的数据列表
private Integer pageSize = 0;//每页显示多少条记录
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Integer getNextPage() {
return nextPage;
}
public void setNextPage(Integer nextPage) {
this.nextPage = nextPage;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getPrePage() {
return prePage;
}
public void setPrePage(Integer prePage) {
this.prePage = prePage;
}
public Integer getTotalPages() {
return totalPages;
}
public void setTotalPages(Integer totalPages) {
this.totalPages = totalPages;
}
public Integer getTotalRows() {
return totalRows;
}
public void setTotalRows(Integer totalRows) {
this.totalRows = totalRows;
}
}
* 功能:主查询程序
* @param hql:要查询的hql语句
* @param values[]:值(对象数组)
* @param currentPage:当前页
* @param pageSize:每页要显示的数据条数
* @return
*/
public PageForm getPageResult(final String hql,final Object[] values, final Integer currentPage,final Integer pageSize) { return (PageForm)getHibernateTemplate().execute( new HibernateCallback(){
public Object doInHibernate(Session session) {
/*****得到统计用的countSql,并统计出共有多少条符合条件的记录*****/
String countHql = getCountHql(hql);
Query query = session.createQuery(countHql);
query = setQuery(query,values); //设置参数
List list1 = query.list();
//得到总记录条数
Integer totalRows = Integer.parseInt(list1.get(0).toString());
query= session.createQuery(hql);
query = setQuery(query,values);
//共有多少页
Integer totalPages =0;
totalPages = (int)Math.ceil((double)totalRows/pageSize);
//由于currentPage是final型的,不能修改,因此必须重新定义一个变量currentPage2代替它
Integer currentPage2= currentPage;
if(currentPage<1) currentPage2=1;
//如果当前页大于总页数,则显示最后一页
if(currentPage>totalPages) currentPage2 = totalPages;
//如果当前页小于0,则显示第一页
if(currentPage<1) currentPage2 = 1;
// 根据条件判断,取出所需记录
int start = pageSize*(currentPage2-1);
query.setFirstResult(start);
query.setMaxResults(pageSize);
List list = query.list();
PageForm pageForm = new PageForm();
pageForm.setTotalRows(totalRows); //记录总条数
pageForm.setCurrentPage(currentPage);
pageForm.setList(list);
pageForm.setTotalPages(totalPages);
pageForm.setPageSize(pageSize);
if(currentPage<totalPages)
pageForm.setNextPage(currentPage+1);
else
pageForm.setNextPage(currentPage);
if(currentPage>1)
pageForm.setPrePage(currentPage-1);
else
pageForm.setPrePage(currentPage);
return pageForm;
}
});
}
/*
* 根据正常hql,统计countHql
* 做法:
* 1.把from前面的变为select count(*) from
* 2.把order by 去掉
*/
private String getCountHql(String hql){
int i = hql.toLowerCase().indexOf("from");
String countHql = hql.substring(i,hql.length());
countHql = "select count(*) "+countHql;
return countHql;
}
/*
*@得到数据类型 (传入java.lang.Boolean 得到Boolean)
*/
private String getType(String typeParam) {
int last = typeParam.lastIndexOf(".");
return typeParam.substring(last + 1);
}/*
* 功能:设置查询条件
*/
private Query setQuery(Query query,Object[] values){
if(values == null)
return query;
int len = values.length;
String type = "";
for(int i=0;i<len;i++){
type = getType(values[i].getClass().getName()); if (type.equals("String")) {
query.setString(i, values[i].toString());
}else if (type.equals("Integer")) {
query.setInteger(i, (Integer)values[i]);
}else if (type.equals("Date")) {
query.setDate(i,(java.sql.Date)values[i]);
}else if (type.equals("Boolean")) {
query.setBoolean(i, (Boolean)values[i]);
}else if (type.equals("Float")) {
query.setFloat(i, (Float)values[i]);
}else if (type.equals("Long")) {
query.setLong(i, (Long)values[i]);
}else if (type.equals("Short")) {
query.setShort(i, (Short)values[i]);
}else if (type.equals("Double")) {
query.setDouble(i, (Double)values[i]);
}else if(type.equals("Time")){
query.setTime(i,(java.sql.Time)values[i]);
}
}
return query;
}
这个在business层调用时,只需传入
1.hql
2.参数值(对象数组)
3.当前要显示第几页
4.每页要显示多少条记录
就行了.原来的设计是要多传入一个统计共有多少条记录的hql,这条执行效率会高的多(执行 select count的效率比把数据取出再统计有多少条记录,高的不是一个数据级的).但这在business层 调用时会比较麻烦.
欢迎大家批评( 不过不要骂人! :) ).