`

Hibernate分页查询与泛型

 
阅读更多

JE有两篇文章,关于分页查询泛型 的,写的很好.这里收藏一下.

Hibernate分页查询小结

JDK5.0后的泛型程序设计

---------------------------------------------

下面是我自己写的分页方法,同时也参考了上面两篇文章.

以下代码用在了实际的项目中.

Page类,计算分页数据

package common.dao;

/**
 * 分页功能
 */
public class Page
{
	public final int	DEFAULT_PAGESIZE	= 15;	// 每页记录数

	public final int	DEFAULT_PAGE		= 1;	// 默认显示第几页

	// =========================================================================================

	protected int		count;						// 总的记录数

	protected int		pageSize;					// 每页记录数

	protected int		pageCount;					// 总的页数

	protected int		page;						// 本页页号

	protected int		start;						// 起始记录下标(MySql从0开始)

	// =========================================================================================
	/**
	 * 构造方法
	 * 
	 * @param nPageSize
	 *            每页记录数
	 * @param nPage
	 *            本页页号
	 */
	public Page(final int nPageSize, final int nPage)
	{
		pageSize = nPageSize; // 每页大小
		page = nPage; // 本页页号
	}

	/**
	 * 构造方法 ,默认每页20条记录
	 * 
	 * @param nPage
	 *            本页页号
	 */
	public Page(final int nPage)
	{
		pageSize = DEFAULT_PAGESIZE; // 每页大小
		page = nPage; // 本页页号
	}

	/**
	 * 构造方法 ,默认每页20条记录,显示第一页
	 * 
	 */
	public Page()
	{
		pageSize = DEFAULT_PAGESIZE; // 每页大小
		page = DEFAULT_PAGE; // 本页页号
	}

	/**
	 * 分页初始化
	 * 
	 * @param nCount
	 *            总的记录数
	 */
	public void init(final int nCount)
	{
		init(nCount, pageSize, page);
	}

	/**
	 * 分页初始化;记录总记录数,每页记录数,当前页,并计算总页数、本页大小和检测当前页是否有效
	 * 
	 * @param nCount
	 *            总的记录数
	 * @param nPageSize
	 *            每页记录数
	 * @param nPage
	 *            本页页号
	 */
	public void init(final int nCount, final int nPageSize, final int nPage)
	{
		count = nCount; // 总的项数
		page = nPage; // 本页页号
		pageSize = nPageSize; // 每页大小
		if (0 >= pageSize)
		{
			pageSize = DEFAULT_PAGESIZE;
		}
		pageCount = (nCount + pageSize - 1) / pageSize; // 计算总的页数

		// 防止 Page 超范围并计算当前页大小
		if (page > pageCount)
		{
			page = pageCount;
		}
		if (page < 1)
		{
			page = DEFAULT_PAGE;
		}

		start = min();
	}

	/**
	 * 计算起始记录下标(MySql从0开始)
	 * 
	 * @return
	 */
	public int min()
	{
		final int max = page * pageSize - 1;
		return max - pageSize + 1;
	}

	//	public int max()
	//	{
	//		final int max = page * pageSize - 1;
	//		return max;
	//	}

	/**
	 * 计算导航页(开始页号)
	 * 
	 * @param nPageNav
	 *            导航页数
	 * @return 开始页号
	 */
	public final int CalcMinPage(final int nPageNav)
	{
		int min = page - (nPageNav / 2);
		int max = page + (nPageNav / 2);
		if (min < 1)
		{
			final int a = 0 - min;
			min = 1;
			max = max + a;
		}
		if (max > pageCount)
		{
			final int b = max - pageCount;
			max = pageCount;
			min = min - b < 1 ? 1 : min - b;
		}
		return min;
	}

	/**
	 * 计算导航页(结束页号)
	 * 
	 * @param nPageNav
	 *            导航页数
	 * @return 结束页号
	 */
	public final int CalcMaxPage(final int nPageNav)
	{
		int min = page - (nPageNav / 2);
		int max = page + (nPageNav / 2);
		if (min < 1)
		{
			final int a = 0 - min;
			min = 1;
			max = max + a;
		}
		if (max > pageCount)
		{
			final int b = max - pageCount;
			max = pageCount;
			min = min - b < 1 ? 1 : min - b;
		}
		return max;
	}

	@Override
	public String toString()
	{
		final StringBuffer sbf = new StringBuffer();
		sbf.append(" 总的记录数:" + count);
		sbf.append(" 每页记录数:" + pageSize);
		sbf.append(" 总的页数:" + pageCount);
		sbf.append(" 本页页号:" + page);
		sbf.append(" 起始记录下标:" + start);
		return sbf.toString();
	}

	public int getCount()
	{
		return count;
	}

	public void setCount(final int count)
	{
		this.count = count;
	}

	public int getPageSize()
	{
		return pageSize;
	}

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

	public int getPageCount()
	{
		return pageCount;
	}

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

	public int getPage()
	{
		return page;
	}

	public void setPage(final int page)
	{
		this.page = page;
	}

	public int getStart()
	{
		return start;
	}

	public void setStart(final int start)
	{
		this.start = start;
	}

}

WebPage (继承自Page) 扩展了在JSP页面上显示 "上一页 1 2 3 下一页" 的功能

package common.web;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import common.dao.Page;

public class WebPage extends Page
{
	public final int	DEFAULT_NAV_SIZE	= 20;			// 导航页数

	private boolean		center				= true;		//默认居中

	private String		className			= "page_css";	//默认CSS

	/**
	 * 构造方法
	 * 
	 * @param nPageSize
	 *            每页记录数
	 * @param nPage
	 *            本页页号
	 */
	public WebPage(final int nPageSize, final int nPage, final String sPageURLParas)
	{
		super(nPageSize, nPage);
		setPageURL(sPageURLParas);
	}

	/**
	 * 构造方法
	 * 
	 * @param nPageSize
	 *            每页记录数
	 * @param nPage
	 *            本页页号
	 */
	public WebPage(final int nPageSize, final int nPage)
	{
		super(nPageSize, nPage);
		setPageURL("");
	}

	/**
	 * 构造方法 ,默认每页20条记录
	 * 
	 * @param nPage
	 *            本页页号
	 */
	public WebPage(final int nPage)
	{
		super(nPage);
		setPageURL("");
	}

	private String	pageURL;	// 导航地址

	private String	pageNAV;	// 导航表格

	public void setPageURL(final String sPageURLPara)
	{
		//final HttpServletRequest request,
		final HttpServletRequest request = ServletActionContext.getRequest();
		if (sPageURLPara.length() > 0)
		{
			pageURL = "?" + sPageURLPara.substring(1) + "&";
		}
		else
		{
			pageURL = "?";
		}
		pageURL = request.getRequestURI() + pageURL + "page=";
		pageNAV = null;
	}

	public String getPageNAV()
	{
		final int nPageNav = DEFAULT_NAV_SIZE; // 导航页数	
		final int nPage = page; // 当前页号
		final int nPageMin = CalcMinPage(nPageNav); // 开始页号
		final int nPageMax = CalcMaxPage(nPageNav); // 结束页号
		final StringBuffer sPageNav = new StringBuffer(1024);
		if (nPageMin < nPageMax)
		{

			sPageNav.append("<table class=\"" + className + "\"");
			if (center)
			{
				//导航条居中 ,样式表
				sPageNav.append(" align=\"center\">");
			}
			sPageNav.append("<tr>\r\n");
			if (nPageMin != nPage)
			{

				sPageNav.append("<td><a href=\"");
				sPageNav.append(pageURL + (nPage - 1));
				sPageNav.append("\">上页</a></td>\r\n");
			}
			else
			{
				sPageNav.append("<td>上页</td>\r\n");
			}
			for (int i = nPageMin; i <= nPageMax; i++)
			{
				sPageNav.append("<td>");
				if (i != nPage)
				{
					sPageNav.append("<a style='text-decoration: underline' href=\"");
					sPageNav.append(pageURL + (i));
					sPageNav.append("\">");
				}
				if (i != nPage)
				{
					sPageNav.append(i);
				}
				else
				{
					sPageNav.append("<b style='color:#ff7700'>" + (i) + "</b>");
				}
				if (i != nPage)
				{
					sPageNav.append("</a>");
				}
				sPageNav.append("</td>\r\n");
			}

			if (nPageMax != nPage)
			{

				sPageNav.append("<td><a style='text-decoration: underline' href=\"");
				sPageNav.append(pageURL + (page + 1));
				sPageNav.append("\">下页</a></td>\r\n");
			}
			else
			{
				sPageNav.append("<td>下页</td>\r\n");
			}
			sPageNav.append("</tr></table>\r\n");
		}
		pageNAV = sPageNav.toString();
		return pageNAV;
	}

	public boolean isCenter()
	{
		return center;
	}

	public void setCenter(final boolean center)
	{
		this.center = center;
	}

	public String getClassName()
	{
		return className;
	}

	public void setClassName(final String className)
	{
		this.className = className;
	}
}

HibernateUtil 类,有两种分页方法

package pic.dao;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import common.dao.Page;

@Repository
public class HibernateUtil extends HibernateDaoSupport
{

	/**
	 * 注入sessionFactory
	 * 
	 * @param sessionFactory
	 */
	@Resource(name = "sessionFactory")
	public void setFactory(final SessionFactory sessionFactory)
	{
		//HibernateDaoSupport上的方法,注入sessionFactory
		setSessionFactory(sessionFactory);
	}

	/**
	 * 取得当前session
	 * 
	 * @return
	 */
	public Session getCS()
	{
		return this.getSession();
		//return this.getSessionFactory().getCurrentSession();
	}

	/**
	 * HQL分页查询
	 * 
	 * @param page
	 *            分页对象,包含分页信息,如每页记录数,当前页码等
	 * @patam patam 参数集合 HQL如下:from User where expertname like :expertname
	 *        map.put("expertname", "%" + expertName + "%");
	 *        expertname是HQL中的:expertname
	 * 
	 * @param hqlCount
	 *            计算总记录数的sql
	 * @param hql
	 *            查询的Sql
	 * @return List 结果集合
	 */
	@SuppressWarnings("unchecked")
	public List findListPage(final Page page, final Map param, final String hqlCount, final String hql)
	{
		final Session session = this.getCS();
		//查询总记录条数的Query
		final Query query_count = session.createQuery(hqlCount);

		//查询的Query
		final Query query = session.createQuery(hql);
		if (param != null)
		{
			//query.setProperties(param);
			final Iterator it = param.keySet().iterator();
			while (it.hasNext())
			{
				final Object key = it.next();
				//两个Query查询条件相同
				query_count.setParameter(key.toString(), param.get(key));
				query.setParameter(key.toString(), param.get(key));
			}
		}
		//总记录数
		final int nCount = ((Long) query_count.iterate().next()).intValue();
		//计算分页数据
		page.init(nCount);
		//从第N条开始 
		query.setFirstResult(page.getStart());
		//取出X条
		query.setMaxResults(page.getPageSize());
		final List list = query.list();
		return list;
	}

	/**
	 * Criteria 分页查询, 要事先设置好查询条件, 再把Criteria对象传进来
	 * 
	 * @param page
	 *            分页对象
	 * @param criteria
	 *            Criteria对象,要事先设置好查询条件, 再把Criteria对象传进来 ,
	 *            如criteria.add(Restrictions.eq("name", "zl"))
	 * 
	 * @return 结果集合
	 */
	@SuppressWarnings("unchecked")
	public List findListPage(final Page page, final Criteria criteria)
	{
		// 获取根据条件分页查询的总行数  
		final int rowCount = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult();
		criteria.setProjection(null);
		//计算分页数据
		page.init(rowCount);
		criteria.setFirstResult(page.getStart());
		criteria.setMaxResults(page.getPageSize());
		return criteria.list();
	}

}

JUnit测试类

package junit_test.pic.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import junit_test.base.JUnitBase_svc;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.junit.BeforeClass;
import org.junit.Test;

import pic.dao.HibernateUtil;
import pic.dao.entity.Email;
import pic.svc.EmailManager;

import common.dao.Page;

/**
 * 测试HibernateUtil 基类
 * 
 * @author zl
 * 
 */
public class HibernateUtilTest extends JUnitBase_svc
{
	static HibernateUtil	hibernateUtil;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception
	{
		hibernateUtil = (HibernateUtil) getBean("hibernateUtil");
	}

	/**
	 * 测试取得hibernateUtil bean
	 */
	@Test
	public void testGetHibernateUtil()
	{
		assertNotNull(hibernateUtil);
	}

	@Test
	public void add()
	{
		//先添加一些邮件
		for (int i = 0; i < 7; i++)
		{
			final Email email = new Email();
			email.setContent("内容2");
			email.setIndex(2);
			email.setQueueName("队列名称2");
			email.setReceivers("Receivers2");
			email.setSubject("Subject2");
			email.setSum(20);
			final EmailManager emailManagerImpl = (EmailManager) getBean("emailManagerImpl");
			emailManagerImpl.add(email);
		}
	}

	/**
	 * 测试分页方法
	 */
	@SuppressWarnings("unchecked")
	@Test
	public void testFindListPage()
	{

		//分页测试 , 第一页
		final String where = " where content=:content ";
		final String hqlCount = "select count(*) from Email" + where;
		final String hql = "from Email" + where;

		final Map<String, Object> param = new HashMap<String, Object>();
		param.put("content", "内容2");

		final List<Email> list = hibernateUtil.findListPage(new Page(), param, hqlCount, hql);
		for (final Email e : list)
		{
			System.out.println(e.toString());
		}

		//测试 超出总页数
		hibernateUtil.findListPage(new Page(10000), param, hqlCount, hql);

		//测试 当前页码小于0
		hibernateUtil.findListPage(new Page(-1), param, hqlCount, hql);
	}

	/**
	 * 测试分页方法
	 */
	@Test
	public void testFindListPage2()
	{
		final Session session = getNewS();
		final Criteria criteria = session.createCriteria(Email.class);
		criteria.add(Restrictions.eq("content", "内容2"));
		//criteria.add(Restrictions.like(propertyName, value))
		final List<Email> list = hibernateUtil.findListPage(new Page(2), criteria);
		for (final Email e : list)
		{
			System.out.println(e.toString());
		}
	}
}

分享到:
评论

相关推荐

    Struts2 Spring3 Hibernate 注解功能 DAO 泛型 通用分页

    Struts2 Spring3 Hibernate 注解功能 DAO 泛型 通用分页

    springmvc+hibernate+spring maven案例(包含分页查询)

    一个用springmvc+hibernate+spring maven实现的增、删、改、查的例子

    基于hibernate 通用查询框架,包含查询、分页列表 功能

    通用查询页面中的查询项、查询出的分页列表都是自动生成的。开发简便、快速,附件中是一套完整的demo和使用说明 支持全部Hql语法格式 Awake 后续功能扩展 1.XML格式数据输出,保证了ajax用户也可以使用Awake框架...

    Hibernate泛型Dao

    基于hibernate5 泛型Dao实例,下载后改一下数据库 配置直接可以用

    Spring/泛型Hibernate的实现

    1.实现泛型的Hibernate 2.Spring+Hibernate搭建 3.maven构建工程

    SSH 泛型DAO分页

    Struts2.1.6+Spring2.5.6+Hibernate3.3.2+mysql整合+分页模板 能用

    spring4+hibernate4+springmvc4+ztree+maven

    spring4+hibernate4+springmvc4+ztree+maven nexus管理支持ztree,以及分页,泛型Dao

    SpringSide的Hibernate封装

    第一层:HibernateGenericDao,基于spring的HibernateDaoSupport,但加入了分页函数与各种Finder函数,并使用泛型避免了返回值强制类型转换。 第二层:HibernateEntityDao,基于HibernateGenericDao,用泛型声明Dao...

    basic-common2h3:基于hibernate3的BaseDao,完成增删改查、分页操作

    实现一个基于hibernate3的基本的dao,实现CRUD; 一行代码完成CRUD,提供多种重载方法详见IBaseDao,但是项目需要基于SSH框架。 ============ 使用方法,以用户添加为例: 1、定义User类,并提供get和set方法。 2、...

    asp.net版的ORM框架(原创)

    自已学习之余写的,类似与Hibernate的一个小框架,支持将DBDataReader直接转为你想要的泛型集合,非常适合三层开发,还带分页功能,欢迎大家试用

    superscangood

    持久化层使用hibernate来实现,使用泛型DAO把添/删/改/查/分页/统计这些操作进行了封装,子类只要继承该DAO就具备这些行为。在实现细粒度权限管理时使用了Struts2中提供的拦截器实现对Action方法的拦截,当发现用户...

    积分管理系统java源码-mystyle:我的风格

    使用泛型封装dao、service、controller基类,包含分页,查询条件封装,从而达到快速crud操作 基于hibernate简单查询条件的封装 权限管理——使用框架apache shiro进行系统认证、授权操作(完成) 系统认证、授权操作 ...

    thinker:自制j2ee快速开发框架,mystyle2.0升级版

    泛型封装dao、service、controller基类,包含分页,查询条件封装,从而达到快速crud操作(参考") 简易代码生成器,增加字段配置功能、生成页面功能,实现增删查改不需要写一句代码(参考) ehcache缓存 springmvc 整合...

    北大青鸟学士后第三单元OA办公自动化管理系统

    (5) src下的applicationContext.xml 和 hibernate.cfg.xml 是hibernate配置信息和Spring的配置分开配置再通过classpath 导入给applicationContext.xml(这两个文件本身已经没使用到了) 项目现在hibernate配置信息都写...

    Java学习笔记-个人整理的

    {13.5}分页查询}{196}{section.13.5} {13.5.1}MySQL}{198}{subsection.13.5.1} {13.6}连接池}{199}{section.13.6} {13.6.1}Wrapper}{199}{subsection.13.6.1} {13.7}DAO}{199}{section.13.7} {13.8}java.util....

    SSH整合开发框架,可直接用于开发

    在做开发时,只需要简单的从genericmanager继承,进行泛型即可。分页也进行了简单的封装。具体方法请看接口类。 3、文件目录:静态资源文件直接放到webcontent下既可以,均采用绝对路径方式引入,避免出错。 jsp...

    java开源包1

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包11

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包2

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包3

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

Global site tag (gtag.js) - Google Analytics