public Page<T> findPage(final Page<T> page, final String hql, final Object... values) { Assert.notNull(page, "page不能为空"); String newHql = createHqlAddOrderBy(hql, page); Query q = createQuery(newHql, values); if (page.isAutoCount()) { int pageNo = page.getPageNo(); int pageSize = page.getPageSize(); long totalCount = countHqlResult(newHql, values); long z = totalCount / pageSize; long y = totalCount % pageSize; long c = pageNo - z; page.setTotalCount(totalCount); if (y == 0 && c == 1) { // 该页没有数据转到上一页 page.setPageNo(Integer.valueOf(pageNo - 1)); } } setPageParameter(q, page); List result = q.list(); page.setResult(result); return page; }
/** 原生SQL分页查询 */ public void findPageByJdbc(Page<T> page, String sql, Object... values) { SQLQuery sqlQuery = getSession().createSQLQuery(sql); if (values != null) { for (int i = 0; i < values.length; i++) { sqlQuery.setString(i, values[i].toString()); } } page.setTotalCount(countSql(sql, values)); List<T> results = sqlQuery .addEntity(entityClass) .setFirstResult(page.getFirst() - 1) .setMaxResults(page.getPageSize()) .list(); page.setResult(results); }
/** * 按Criterion分页查询. * * @param page 分页参数.包括pageSize、firstResult、orderBy、asc、autoCount. 其中firstResult可直接指定,也可以指定pageNo. * autoCount指定是否动态获取总结果数. * @param criterion 数量可变的Criterion. * @return 分页查询结果.附带结果列表及所有查询时的参数. */ public Page<T> findByCriteria(Page page, Criterion... criterion) { Assert.notNull(page); Criteria c = createCriteria(criterion); if (page.isAutoCount()) { page.setTotalCount(countQueryResult(page, c)); } if (page.isOrderBySetted()) { if (page.getOrder().endsWith("asc")) { c.addOrder(Order.asc(page.getOrderBy())); } else { c.addOrder(Order.desc(page.getOrderBy())); } } // hibernate的firstResult的序号从0开始 c.setFirstResult(page.getFirst() - 1); c.setMaxResults(page.getPageSize()); page.setResult(c.list()); return page; }