hibernate分页
2016-03-25 16:14
393 查看
第一种:
这一种需要sql拼接
第二种:
package com.ss.dao.imp; import java.sql.SQLException; import java.util.List; import org.apache.commons.lang.StringUtils; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; @SuppressWarnings("rawtypes") public abstract class MyBaseDAOImpl extends HibernateDaoSupport { /** * 加条件、分页查询所有对象,返回集合list * @param where 拼接的sql * @param orderby 排序 * @param params 参数 * @param start 开始页 * @param size * @return */ public List search(final String where, final String orderby,final Object[] params, final int start, final int size) { // 获取hibernate Query查询的sql语句 final String hql = getQueryHql(); // 执行查询方法,返回list集合 List list = getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { StringBuffer sqlBuffer = new StringBuffer(hql); // 拼接sql条件 if (StringUtils.isNotEmpty(where)) { sqlBuffer.append(" and " + where); } if (StringUtils.isNotEmpty(orderby)) { sqlBuffer.append(" order by " + orderby); } // 创建查询query对象 Query query = session.createQuery(sqlBuffer.toString()); session.flush(); if (null != params) { int paramsCount = params.length; for (int n = 0; n < paramsCount; n++) { query.setParameter(n, params ); } } if (start >= 0) { query.setFirstResult(start); } if (size > 0) { query.setMaxResults(size); } List list = query.list(); return list; } }); return list; } // 加条件查询所有对象,返回集合list public List search(final String where, final String orderby,final Object[] params) { return search(where, orderby, params, 0, 0); } /** * 统计数据库表中数据总数 */ public long getRecordCount(final String where, final Object[] params) { // 获得统计查询的sql语句 final String hql = getQueryCountHql(); List list = getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { StringBuffer sqlBuffer = new StringBuffer(hql); // 拼接sql条件 if (StringUtils.isNotEmpty(where)) { sqlBuffer.append(" and " + where); } Query query = session.createQuery(sqlBuffer.toString()); if (null != params) { int paramsCount = params.length; for (int n = 0; n < paramsCount; n++) { query.setParameter(n, params ); } } List list = query.list(); return list; } }); if (list.size() == 0) { return 0; } Object o = list.get(0); return ((Long) o); } // hibernate Query查询的sql语句 public abstract String getQueryHql(); // 统计总数据的sql public abstract String getQueryCountHql(); }
package com.demo.dao; import org.springframework.stereotype.Component; import com.fulongtech.vams.util.demo.dao.imp.MyBaseDAOImpl; @Component @SuppressWarnings("rawtypes") public class MyScaffoldDao extends MyBaseDAOImpl{ @Override public String getQueryHql() { return "from main.java.com.fulongtech.vams.scaffold.entity.Scaffold as vo where 1=1"; } @Override public String getQueryCountHql() { return "select count(vo.id) from main.java.com.fulongtech.vams.scaffold.entity.Scaffold as vo where 1=1"; } }
package com..vams.util.demo.controller; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.fulongtech.vams.scaffold.entity.Scaffold; import com.fulongtech.vams.scaffold.service.ScaffoldService; import com.fulongtech.vams.util.demo.PageUtil; import com.fulongtech.vams.util.demo.dao.MyScaffoldDao; import com.fulongtech.vams.util.demo.dao.imp.MyBaseDAOImpl; @SuppressWarnings("rawtypes") @Controller @RequestMapping("/scaffold") public class MyScaffoldController extends MyBaseDAOImpl{ @Resource private MyScaffoldDao myScaffoldDao; @Resource private ScaffoldService scaffoldService; //分页参数 private Integer page = 1; private Long totalCount = 0l; private Long totalPage = 0l; public Integer getPage() { return page; } public void setPage(Integer page) { this.page = page; } public Long getTotalCount() { return totalCount; } public void setTotalCount(Long totalCount) { this.totalCount = totalCount; } public Long getTotalPage() { return totalPage; } public void setTotalPage(Long totalPage) { this.totalPage = totalPage; } @SuppressWarnings("unchecked") @ResponseBody @RequestMapping(value = "/test") public List<Scaffold> test(String scaffoldId){ Scaffold scaffold = scaffoldService.findScaffoldById(scaffoldId); String where = ""; // 1 and vo.isStatus in('0','1','2','3') and vo.drafters.id=" + u.getId(); long recordCount = myScaffoldDao.getRecordCount(where,null);// 根据条件查询据库表中数据总数 PageUtil pu = PageUtil.getPage(20, page, recordCount);// 分页 this.setPage(pu.getPage()); this.setTotalPage(pu.getTotalPage()); this.setTotalCount(pu.getTotalCount()); List list = myScaffoldDao.search(where, "vo.scaffold_id desc", null, pu.getStart().intValue(), 20);// 获得20条数据,按生成时间降序排序 return list; } @Override public String getQueryHql() { // TODO Auto-generated method stub return null; } @Override public String getQueryCountHql() { // TODO Auto-generated method stub return null; } }
package com.vams.util.demo; public class PageUtil { private Long totalPage; private Long totalCount; private Integer page; private Integer pageSize; private Long start; public static PageUtil getPage(Integer pageSize,Integer page, Long totalCount) { PageUtil pu = new PageUtil(); pu.setPageSize(pageSize); pu.setTotalCount(totalCount); Long pageCount = totalCount / pageSize; if ((totalCount % pageSize) > 0) pageCount++; pu.setTotalPage(pageCount); if (page < 1) page = 1; if (page > pageCount) page = pageCount.intValue(); pu.setPage(page); Long start = new Long((page - 1) * pageSize); pu.setStart(start); return pu; } public Long getTotalPage() { return totalPage; } public void setTotalPage(Long totalPage) { this.totalPage = totalPage; } public Long getTotalCount() { return totalCount; } public void setTotalCount(Long totalCount) { this.totalCount = totalCount; } public Integer getPage() { return page; } public void setPage(Integer page) { this.page = page; } public Integer getPageSize() { return pageSize; } public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } public Long getStart() { return start; } public void setStart(Long start) { this.start = start; } }
这一种需要sql拼接
第二种:
package com..vams.util.demo.dao; import java.util.List; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.transform.Transformers; import org.hibernate.type.StandardBasicTypes; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.fulongtech.vams.scaffold.entity.Scaffold; import com.fulongtech.vams.util.demo.entity.PagePO; import com.fulongtech.vams.util.demo.entity.PreparedSqlAndArgs; @Component @SuppressWarnings("rawtypes") public class MyScaffoldDao1 { public static final String GET_NOT_ACTIVE_PARENT = " select * from SCAFFOLD as s where s.SCAFFOLD_ID=? and s.SCAFFOLD_TYPE=? "; public static final String GET_NOT_ACTIVE_PARENT_COUNT = " select count(1) from SCAFFOLD as s where s.SCAFFOLD_ID=?"; @Autowired private SessionFactory sessionFactory; protected Session getSession() { return sessionFactory.getCurrentSession(); } @SuppressWarnings("unchecked") public PagePO test(long id, int page, int pageSize) { final int offset = PagePO.countOffset(pageSize, page);// 当前页开始记录 PreparedSqlAndArgs p = new PreparedSqlAndArgs(GET_NOT_ACTIVE_PARENT, new Object[] { id }); Query query = ((SQLQuery) getSession().createSQLQuery(p.sql).setResultTransformer(Transformers.aliasToBean(Scaffold.class))); for (int i = 0; i < p.args.length; i++) { query.setParameter(i, p.args[i]); } int allRow = getCount(id);// 总记录数 query.setFirstResult(offset); if (pageSize >= 0) { query.setMaxResults(pageSize); } List<Scaffold> list = (List<Scaffold>) query.list(); int totalPage = PagePO.countTotalPage(pageSize, allRow);// 总页数 final int currentPage = PagePO.countCurrentPage(page); PagePO pagePO = new PagePO(); pagePO.setPageSize(pageSize); pagePO.setCurrentPage(currentPage); pagePO.setAllRow(allRow); pagePO.setTotalPage(totalPage); pagePO.setList(list); pagePO.init(); return pagePO; } public int getCount(long id) { PreparedSqlAndArgs p = new PreparedSqlAndArgs(GET_NOT_ACTIVE_PARENT_COUNT, new Object[] { id }); Query query = getSession().createSQLQuery(p.sql); for (int i = 0; i < p.args.length; i++) { query.setParameter(i, p.args[i]); } int allRow = Integer.parseInt(query.uniqueResult().toString());// 总记录数 return allRow; } }
package com.vams.util.demo.entity; import java.util.Arrays; import org.hibernate.SQLQuery; public class PreparedSqlAndArgs { public final String sql; public final Object[] args; public PreparedSqlAndArgs(String sql, Object[] args) { this.sql = sql; this.args = args; } public void appendParams(SQLQuery query){ for (int i = 0; i < args.length; i++) { query.setParameter(i, args[i]); } } public String toString() { return "PreparedSqlAndArgs [sql=" + sql + ", args="+ Arrays.toString(args) + "]"; } }
package com.vams.util.demo.entity; import java.util.List; @SuppressWarnings("unused") public class PagePO<T> { private List<T> list;// 要返回的某一页的记录列表 private int allRow; // 总记录数 private int totalPage;// 总页数 private int currentPage;// 当前页 private int pageSize;// 每页记录数 private boolean isFirstPage;// 是否为第一页 private boolean isLastPage;// 是否为最后一页 private boolean hasPreviousPage;// 是否有前一页 private boolean hasNextPage;// 是否有下一页 public List<T> getList() { return list; } public void setList(List<T> list) { this.list = list; } public int getAllRow() { return allRow; } public void setAllRow(int allRow) { this.allRow = allRow; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } /** * 初始化分页信息 */ public void init() { this.isFirstPage = isFirstPage(); this.isLastPage = isLastPage(); this.hasPreviousPage = isHasPreviousPage(); this.hasNextPage = isHasNextPage(); } /** * 以下判断页的信息 * @return */ public boolean isFirstPage() { return currentPage == 1;// 如是当前页是第1页 } public boolean isLastPage() { return currentPage == totalPage;// 如果当前页是最后一页 } public boolean isHasPreviousPage() { return currentPage != 1;// 只要当前页不是第1页 } public boolean isHasNextPage() { return currentPage != totalPage;// 只要当前页不是最后1页 } /** * 计算总页数 * @param pageSize 每页记录数 * @param allRow 总记录数 * @return 总页数 */ public static int countTotalPage(final int pageSize, final int allRow) { int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow / pageSize + 1; return totalPage; } /** * 计算当前页开始记录 * @param pageSize 每页记录数 * @param currentPage 当前第几页 * @return 当前页开始记录号 */ public static int countOffset(final int pageSize, final int currentPage) { final int offset = pageSize * (currentPage - 1); return offset; } /** * 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替 * @param page 传入的参数 * @return 当前页 */ public static int countCurrentPage(int page) { final int curPage = (page == 0 ? 1 : page); return curPage; } }
相关文章推荐
- java 泛型小总结
- C#语音录制
- leetcode-5 Longest Palindromic Substring(回文子序列)
- CentOS6.6安装CloudStack4.8
- 【BZOJ 2844】 albus就是要第一个出场|线性基
- struts2.properties
- Spring和Mybatis整合时无法读取properties的处理方案
- C++中有关数组的一些细节问题
- android使用mpchartlib设置图表
- 一篇文章,带你明白什么是过拟合,欠拟合以及交叉验证
- 如何计算树中叶子结点的个数?
- POSIX多线程程序设计 工作流例程2
- 图片.pkm格式转换为.png格式
- capistrano3.4.0部署不能自动登录
- 当CAD图形中无法进行复制、粘贴时,请将此DWG另存一下或许就可以了
- capistrano3.4.0部署不能自动登录
- StudyJams第一课的学习
- 关于整数和真分数的四则运算的算法,整数已通过,但真分数不能化到最简的问题求大神指导啊
- 做一个合格的程序猿之浅析Spring AOP源码(十七) Spring AOP开发大作战
- python笔记---常见异常