`
superzhaoxi
  • 浏览: 61095 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Hibernate 分页应用

阅读更多

在项目中,分页是经常要用到的,详细记录Hibernate分页技术:

 

1.借用robbin的代码,稍做修改

   AbstractManager.java
package com.wygl.dao;

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.wygl.service.*;   
  
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);   
    }   
  
    @SuppressWarnings("unchecked")
    public Object load(final Class entity, final Serializable id) {   
        return getHibernateTemplate().load(entity, id);   
    }   
  
    @SuppressWarnings("unchecked")
    public Object get(final Class entity, final Serializable id) {   
        return getHibernateTemplate().get(entity, id);   
    }   
  
    @SuppressWarnings("unchecked")
    public List findAll(final Class entity) {   
        return getHibernateTemplate().find("from " + entity.getName());   
    }   
  
    @SuppressWarnings("unchecked")
    public List findByNamedQuery(final String namedQuery) {   
        return getHibernateTemplate().findByNamedQuery(namedQuery);   
    }   
  
    @SuppressWarnings("unchecked")
    public List findByNamedQuery(final String query, final Object parameter) {   
        return getHibernateTemplate().findByNamedQuery(query, parameter);   
    }   
  
    @SuppressWarnings("unchecked")
    public List findByNamedQuery(final String query, final Object[] parameters) {   
        return getHibernateTemplate().findByNamedQuery(query, parameters);   
    }   
  
    @SuppressWarnings("unchecked")
    public List find(final String query) {   
        return getHibernateTemplate().find(query);   
    }   
  
    @SuppressWarnings("unchecked")
    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);   
    }   
  
    @SuppressWarnings("unchecked")
    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);   
    }   
  
    @SuppressWarnings("unchecked")
    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();   
    }   
}  

 

 

PaginationSupport.java 

package com.wygl.service;

import java.util.List;   

public class PaginationSupport {   
  
	//每页数量
    public final static int PAGESIZE = 30;   
  
    private int pageSize = PAGESIZE;   
  
    //查出的记录
    @SuppressWarnings("unchecked")
	private List items;   
  
    //记录总数
    private int totalCount;   
  
    private int[] indexes = new int[0];   
  
    //开始索引号
    private int startIndex = 0;   
    
    //当前页数
    private int page = 0;
    
    public void setPage(int page){
    	this.page = page;
    }
    
    public int getPage(){
    	return startIndex / pageSize + 1;
    }
    
    //总页数
    private int totalPage = 0;
    
    public void setTotalPage(int totalPage){
    	this.totalPage = totalPage;
    }
    
    public int getTotalPage(){
    	int count = totalCount / pageSize;   
        if (totalCount % pageSize > 0)   
            count++;   
        return count;
    }
    
    @SuppressWarnings("unchecked")
    public PaginationSupport(List items, int totalCount) {   
        setPageSize(PAGESIZE);   
                setTotalCount(totalCount);   
        setItems(items);           
        setStartIndex(0);   
    }   
  
    @SuppressWarnings("unchecked")
    public PaginationSupport(List items, int totalCount, int startIndex) {   
                setPageSize(PAGESIZE);   
        setTotalCount(totalCount);   
        setItems(items);           
        setStartIndex(startIndex);   
    }   
  
    @SuppressWarnings("unchecked")
    public PaginationSupport(List items, int totalCount, int pageSize, int startIndex) {   
                setPageSize(pageSize);   
        setTotalCount(totalCount);   
        setItems(items);   
        setStartIndex(startIndex);   
    }   
  
    @SuppressWarnings("unchecked")
    public List getItems() {   
        return items;   
    }   
  
    @SuppressWarnings("unchecked")
    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 -1;   
        else  
            return nextIndex;   
    }   
  
    public int getPreviousIndex() {   
        int previousIndex = getStartIndex() - pageSize;   
        if (previousIndex < 0)   
            return -1;   
        else  
            return previousIndex;   
    }   
  
}  

 

 

写好2个类后,下来就是应用

 

2. Action中这样

UserManagerAction.java

	/** 
	 * DD注释: 显示所有用户
	 * 分页显示!
	 * @param mapping
	 * @param form
	 * @param request
	 * @param response
	 * @return
	 */
	public ActionForward doShowUser(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response){
		int startIndex;    //每页开始索引号
		int pageSize = 1;  //每页记录数
		//获取要访问的页数,第一次访问第一页
		String strPage = request.getParameter("page");
		if(strPage==""||strPage==null){
			startIndex = 0;
		}else{
			startIndex = Integer.parseInt(strPage);
		}
		//查找并返回PaginationSupport类型ps,将ps抛到web层
		PaginationSupport ps = userService.findUser(pageSize,startIndex);
		request.setAttribute("ps", ps);
		System.out.println("2");
		return mapping.findForward("showUser");
	}

 

UserService.java

	/**
	 * 查找所有用户,分页!
	 * @param pageSize 每页记录数
	 * @param startIndex 开始索引号
	 * @return
	 */
	public PaginationSupport findUser(int pageSize,int startIndex){
		//构造DetachedCriteria动态查询条件
		DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
		return userDAO.findPageByCriteria(detachedCriteria, pageSize, startIndex);
	}
	

 

3. 在页面这样应用

showUser.jsp

		<c:if test="${ps.page-1 !=0 }">
			<a href="userManager.do?command=showUser&page=0">首页</a>
		</c:if>
		<c:if test="${ps.previousIndex != -1 }">
			<a href="userManager.do?command=showUser&page=${ps.previousIndex }">上一页</a>
		</c:if>
		共查到${ps.totalCount }个用户,共${ps.totalPage }页 第${ps.page }页
		<c:if test="${ps.nextIndex != -1}">
			<a href="userManager.do?command=showUser&page=${ps.nextIndex }">下一页</a>
		</c:if>
		<c:if test="${ps.page != ps.totalPage }">
			<a href="userManager.do?command=showUser&page=${ps.totalPage -1 }">末页</a>
		</c:if>
		
分享到:
评论
4 楼 phenom 2008-11-01  
浪费了你的资源,把情况说明白点。开始是这样的:
输出用户
9* zxcvzxc* 985211* wrfwsh@gmail.com
4* wsh* 985211* wrfwsh@gmail.com
1* wrfwsh* 985211* wrfwsh@gmail.com
struts 输出页码
第[0]页 第[1]页 第[2]页 第[3]页
totalCount:11
startIndex:0
点第二页是这样的:
输出用户
2* archko* 985211* wrfwsh@gmail.com
5* arch* 985211* wrfwsh@gmail.com
10* aftwy* 985211* wrfwsh@gmail.com
struts 输出页码

totalCount:0
startIndex:0
3 楼 phenom 2008-11-01  
对了,把你在DAO里的实现方法放在BaseDAOHibernate里
2 楼 phenom 2008-11-01  
我觉得不是这样用的、定义这样一个父类
public class BaseDAOHibernate extends HibernateDaoSupport implements Dao{}
子类:public class UserDaoHibernate extends BaseDAOHibernate implements UserDao{}
子类的接口:public interface UserDao extends Dao{
public PaginationSupport findPageByCriteria(
            final DetachedCriteria detachedCriteria);
    public PaginationSupport findPageByCriteria(
            final DetachedCriteria detachedCriteria,final int startIndex);
    public PaginationSupport findPageByCriteria(
            final DetachedCriteria detachedCriteria,final int pageSize,
            final int startIndex);
}
这样就行了。因为它没有依赖任何的DAO类。查询的DetachedCriteria 也是外面构造的。既然是复用,当然不能只用一次了。只要DAO实现类继承了BaseDaoHibernate就有 了这个方法,在其接口上定义就行了? 我是这样就可以成功的。其它代码不变。
有一个问题:
我直接抄它的PanigationSUpport类,没有改变,然后action是:
{
int pageSize=3;
		int startIndex;
		String strPage=request.getParameter("startIndex");
		if(strPage==""||strPage==null){
			startIndex = 0;
		}else{
			startIndex = Integer.parseInt(strPage);
		}
PaginationSupport ps=mgr.findUserByCriteria(pageSize,startIndex);
		System.out.println("每页大小"+ps.getPageSize());
		System.out.println("开始索引"+ps.getStartIndex());
		System.out.println("数据总数"+ps.getTotalCount());
		System.out.println("索引数组长度"+ps.getIndexes().length);
		request.setAttribute("ps",ps);
		request.setAttribute("comments",ps.getItems());
		request.setAttribute("indes",ps.getIndexes());
		request.setAttribute("totalCount",ps.getTotalCount());
		request.setAttribute("startIndex",ps.getStartIndex());
		return mapping.findForward("viewAllComments");

}
打印来的只有startIndex为0时才有 数据::
每页大小3
开始索引0
数据总数11
索引数组长度4
而点击第二页或是其它的话:Hibernate: select this_.id as id0_1_, this_.username as username0_1_, this_.password as password0_1_, this_.email as email0_1_, picture2_.id as id4_0_, picture2_.pname as pname4_0_, picture2_.premark as premark4_0_, picture2_.pcontent as pcontent4_0_, picture2_.userid as userid4_0_ from wrf.bloguser this_ left outer join wrf.blogpicture picture2_ on this_.id=picture2_.id order by this_.username desc limit ?, ?
Hibernate: select count(*) as y0_ from wrf.bloguser this_ order by this_.username desc limit ?, ?
每页大小3
开始索引0
数据总数0
索引数组长度0
JSP页面是这样的。::只有页码。其它略。
<logic:iterate id="item" name="indes" indexId="index">
			<a href="viewAllComments.do?startIndex=<bean:write name="item" />">
			第[<bean:write name="index" />]页</a>
		</logic:iterate>
点第二页,出现的是第二页的内容,但上面打印出来 的结果却不正确的。而且第二页就没有了页码了。都显示为0。哪里出错了?请指教。
1 楼 wjhlangzi 2008-10-16  
分页是实现了。中间少点数字。。。
上一页 1 2 3 4 5 6 7 8 9 10 下一页 当前第8页/共33页

相关推荐

    spring+struts+hibernate分页应用事例

    通过以上分析可以看出,利用Spring、Struts与Hibernate这三个框架可以高效地实现Web应用中的分页功能。其中,**PageBean** 类作为基础模型,存储了分页所需的各种信息;**PaginateInterface** 接口定义了分页操作的...

    hibernate和struts完美应用和分页演示示例

    hibernate和struts完美应用和分页演示示例 &lt;br&gt;此工程是hibernate和struts完美应用和分页演示示例。 &lt;br&gt;特点: 一、使用MS SERVER 2000的pubs数据库,并写了演示用的数据库脚本 二、应用hibernate和...

    hibernate分页Hibernate 分页的设计和编码

    标题与描述均提到了“Hibernate分页的设计和编码”,这表明文章主要聚焦于如何在Hibernate框架中实现数据分页功能。下面将详细解析这一主题的关键知识点。 ### Hibernate分页概念 Hibernate是Java环境下一个开放源...

    STRUTS2+HIBERNATE详细的分页实现代码详细的分页实现代码

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是如何在Struts2与Hibernate框架结合下实现分页功能。接下来将详细解析Struts2与Hibernate如何协作完成这一任务。 ### Struts2与Hibernate...

    hibernate分页查询

    让我们深入探讨Hibernate分页查询的相关知识点。 一、Hibernate分页原理 Hibernate分页查询基于SQL的LIMIT和OFFSET子句,通过Session的createQuery或createSQLQuery方法创建查询,并设置FirstResult和MaxResults...

    hibernate分页查询 数据库连接

    此外,优化查询,避免N+1查询问题,合理设计实体关系,都能有效提升Hibernate分页查询的效率。 总结起来,Hibernate的分页查询和数据库连接管理是其强大功能的重要组成部分。正确理解和使用这些特性,能够帮助...

    struts2+spring+hibernate分页显示完整代码

    在实际应用中,我们通常会在业务层(Service层)处理分页逻辑,然后将`PageBean`对象传递到视图层(如JSP页面),展示分页信息。例如,在服务层,我们可以根据用户请求的页码和每页大小来调用DAO层的分页查询方法,...

    Struts + Hibernate 分页实现

    在"Struts + Hibernate 分页实现"这个项目中,重点在于如何在Web应用中整合这两个框架,并实现数据的分页显示。分页是大型数据集处理时常见的需求,它能够帮助用户更有效地浏览和管理大量信息,避免一次性加载所有...

    hibernate分页代码

    总结起来,"hibernate分页代码"是一个关于如何在Hibernate中进行分页查询的实践示例,适用于在MyEclipse环境下运行。通过Criteria API或HQL,开发者能够方便地实现分页功能,提升应用性能,为用户提供更好的体验。...

    spring+hibernate 分页 +mysql

    这里我们讨论的是结合Spring、Hibernate和MySQL实现的分页功能,这是一个常见的技术栈组合,广泛应用于Web应用开发。 Spring是一个开源的Java框架,它提供了全面的编程和配置模型,用于构建企业级应用。Spring的IoC...

    Struts和Hibernate分页及查询

    在"Struts+Hibernate分页及条件查询练习"这个项目中,开发者可能采用了以下步骤: 1. **配置Struts和Hibernate**:首先,需要在项目中引入Struts和Hibernate的相关库,配置Struts的struts-config.xml文件和...

    hibernate实现分页

    ### Hibernate分页基础 1. **Criteria API**:Hibernate的Criteria API允许我们创建动态查询,同时也支持分页。通过设置`setFirstResult()`和`setMaxResults()`方法,可以实现分页效果。例如: ```java Criteria ...

    Hibernate分页封装

    Hibernate分页封装可以应用于各种需要分页的场景,例如,Web应用程序、移动应用程序、桌面应用程序等等。在这些场景中,我们可以使用Hibernate分页封装来提高查询效率和减少数据传输量。 Hibernate分页封装是一种...

    用户Hibernate实现的一个分页

    一、Hibernate分页基础 1. Hibernate的Query和Criteria API都提供了分页功能。使用`setFirstResult()`方法设置查询开始的位置,即第几条记录,以及`setMaxResults()`方法设置一次返回的最大记录数,这两者结合即可...

    使用hibernate分页查询

    1. **配置Hibernate分页**: 在Hibernate中,我们通常使用`Criteria`或`Query` API进行分页查询。`Criteria`提供了一种更面向对象的方式来执行SQL查询,而`Query` API则对应于原生的SQL语句。在这些API中,我们可以...

    struts+hibernate分页

    综上所述,"struts+hibernate分页"涉及到的主要是如何在Struts的控制层和Hibernate的数据层之间协调处理分页请求,以及在DAO层利用Hibernate的特性实现数据库查询的分页。理解并掌握这两个框架的分页机制,对于开发...

    Struts+Hibernate实现分页

    本篇将介绍如何使用Struts和Hibernate框架来实现Web应用中的分页功能。 首先,Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它负责处理用户请求并控制应用程序的流程。而Hibernate则是一...

    高效率的dw+spring+hibernate分页演示例子

    在IT行业中,开发高效、可扩展的Web应用是至关重要的,...总之,"高效率的dw+spring+hibernate分页演示例子"是一个深入理解现代Java Web开发中重要技术的绝佳实践,对于提升开发技能和掌握企业级应用开发有极大的帮助。

    完整Struts2 HIBERNATE实现分页

    根据提供的标题、描述以及部分内文,我们可以梳理出...通过以上步骤,我们就可以在一个Java Web应用程序中实现Struts2与Hibernate结合的分页功能。这种方法不仅提高了开发效率,而且使得代码更加简洁、易读和易于维护。

    Hibernate 分页查询效果

    本篇主要围绕"Hibernate分页查询效果"这一主题,深入探讨如何利用Hibernate框架实现高效、便捷的分页功能。 首先,Hibernate是一个优秀的Java持久化框架,它提供了ORM(对象关系映射)解决方案,使得开发者可以使用...

Global site tag (gtag.js) - Google Analytics