本文討論範疇只在真分頁,下面談到的分頁也特指真分頁)。
分頁共性
三種資料的分頁方式的比較
MySql資料庫特色分頁
Oracle資料庫常用分頁
select T.*,rownum rn from () T where rownum <PageNo*PageSize) where rn >=(PageNo-1)*PageSize
select A.*,rownum rn from () A where rownum <41) where rn >=20
SqlServer資料常用分頁
緊跟這第一頁顯示的記錄之後的5條記錄,也就是通過對userID欄位進行降序排列時,它們是除了第一頁資料之後的5條記錄,也就是它們的userID不在第一頁的UserID之中,在SQL語句有一個not in這個正好可以排上用場。 首先我們按照對UserID進行降序排序,查詢出前面第一頁使用的資料的UserID,SQL語句及執行結果如下:
select 5 userID from t_User order by userID asc) order by userID asc
select top(n-1)*5 userID from t_User order by userID asc) order by userID asc
Hibernate架構的分頁
public class AbstractPageManager extends HibernateDaoSupport {/** * 根據HQL語句,獲得尋找總記錄數的HQL語句 如: * select ... from Organization o where o.parent is null * 經過轉換,可以得到: * select count(*) from Organization o where o.parent is null * * @param hql * @return */private String getCountQuery(String hql) {// 取得from的位置int index = hql.indexOf("from");// 返回:查詢記錄條數 的SQL語句if (index != -1) {return "select count(*) " + hql.substring(index);}throw new SystemException("無效的HQL查詢語句");}/** * 根據HQL語句進行分頁查詢 * * @param hql HQL語句 * @param params HQL語句帶的多個參數 * @param offSet 從第幾個記錄開始查詢 * @param pageSize 每頁顯示多少行 * @return */public PageModel searchPaginate(String hql, Object[] params, int offSet,int pageSize) {// 記錄條數String strCount = getCountQuery(hql);// 查詢條數Query query = getSession().createQuery(strCount);// 將HQL語句帶的多個參數 賦值給Queryif (params != null && params.length > 0) {for (int i = 0; i < params.length; i++) {query.setParameter(i, params[i]);}}// 擷取查詢條數int intCount = ((Long) query.uniqueResult()).intValue();// 查詢Organization記錄query = getSession().createQuery(hql);// 將HQL語句帶的多個參數 賦值給Queryif (params != null && params.length > 0) {for (int i = 0; i < params.length; i++) {query.setParameter(i, params[i]);}}/* * offSet 設定從第幾個記錄開始查詢 * pageSize 設定每頁顯示多少行 */query.setFirstResult(offSet);query.setMaxResults(pageSize);//組裝PageModelPageModel pageModel = new PageModel();pageModel.setDatas(query.list());pageModel.setTotal(intCount);return pageModel;}}