六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 222|回复: 0

Hibernate分页查询与泛型

[复制链接]

升级  22.33%

79

主题

79

主题

79

主题

举人

Rank: 3Rank: 3

积分
267
 楼主| 发表于 2013-2-8 00:04:37 | 显示全部楼层 |阅读模式
JE有两篇文章,关于分页查询泛型 的,写的很好.这里收藏一下.
 
Hibernate分页查询小结
 
JDK5.0后的泛型程序设计
 
---------------------------------------------
下面是我自己写的分页方法,同时也参考了上面两篇文章.
以下代码用在了实际的项目中.
 
Page类,计算分页数据
package common.dao;/** * 分页功能 */public class Page{public final intDEFAULT_PAGESIZE= 15;// 每页记录数public final intDEFAULT_PAGE= 1;// 默认显示第几页// =========================================================================================protected intcount;// 总的记录数protected intpageSize;// 每页记录数protected intpageCount;// 总的页数protected intpage;// 本页页号protected intstart;// 起始记录下标(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;}@Overridepublic 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 intDEFAULT_NAV_SIZE= 20;// 导航页数private booleancenter= true;//默认居中private StringclassName= "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 StringpageURL;// 导航地址private StringpageNAV;// 导航表格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;@Repositorypublic class HibernateUtil extends HibernateDaoSupport{/** * 注入sessionFactory *  * @param sessionFactory */@Resource(name = "sessionFactory")public void setFactory(final SessionFactory sessionFactory){//HibernateDaoSupport上的方法,注入sessionFactorysetSessionFactory(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();//查询总记录条数的Queryfinal Query query_count = session.createQuery(hqlCount);//查询的Queryfinal 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 HibernateUtilhibernateUtil;@BeforeClasspublic static void setUpBeforeClass() throws Exception{hibernateUtil = (HibernateUtil) getBean("hibernateUtil");}/** * 测试取得hibernateUtil bean */@Testpublic void testGetHibernateUtil(){assertNotNull(hibernateUtil);}@Testpublic 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")@Testpublic 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);//测试 当前页码小于0hibernateUtil.findListPage(new Page(-1), param, hqlCount, hql);}/** * 测试分页方法 */@Testpublic 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());}}} 
 
 
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表