Hibernate 分頁查詢:設計模式與完整代碼實現
核心參數設計
| 參數 | 來源 | 說明 |
currentPage | 請求參數 page | 當前頁碼(從 1 開始),Integer.parseInt(request.getParameter("page")) |
pageSize | 固定配置 | 每頁記錄數,如 int pageSize = 5; |
totalCount | 數據庫統計 | select count(*) from Users |
totalPageCount | 計算得出 | (totalCount + pageSize - 1) / pageSize,至少為 1 |
DAO 層分頁查詢實現
public List findPagedAll(int currentPage, int pageSize) {
String queryString = "from User";
Query queryObject = getSession().createQuery(queryString);
queryObject.setFirstResult((currentPage - 1) * pageSize); // 偏移量
queryObject.setMaxResults(pageSize); // 限制筆數
return queryObject.list();
}
前端頁面控制邏輯
上一頁 / 下一頁鏈接
<c:if test="${currentPage > 1}">
<a href="listuser.do?page=${currentPage-1}">上一頁</a>
</c:if>
<c:if test="${currentPage <= 1}">
上一頁 <!-- 僅顯示文本,無鏈接 -->
</c:if>
<c:if test="${currentPage < totalPageCount}">
<a href="listuser.do?page=${currentPage+1}">下一頁</a>
</c:if>
數據展示
<c:forEach items="${users}" var="user">
${user.id} - ${user.username}
</c:forEach>
下拉框跳轉頁面
<script>
function jumpPage(select) {
var newUrl = "/hibernate_page/index.jsp?page=" + select.value;
document.location = newUrl;
}
</script>
<select onchange="jumpPage(this);">
<c:forEach begin="1" end="${totalPageCount}" var="i">
<option value="${i}" ${currentPage == i ? 'selected' : ''}>${i}頁</option>
</c:forEach>
</select>
關鍵設計要點
- 參數校驗:確保
currentPage 在 [1, totalPageCount] 範圍內
- 零記錄處理:
totalPageCount 計算結果為 0 時強制設為 1,避免除零錯誤
- 偏移量計算:
(currentPage - 1) * pageSize,首頁偏移為 0
- 前後端協議:頁碼從 1 開始,與用戶直覺一致