在企業級 Java 開發中,數據分頁是極為常見的需求。Hibernate 作為經典的 ORM 框架,提供了多種分頁實現路徑。本文將深入剖析 Criteria API 與 HQL 兩大主流分頁方案的核心代碼、原理差異及適用場景,幫助開發者根據業務複雜度做出最優技術選型。
Criteria API 以強類型、物件導向的方式構建查詢,適合動態條件組合場景。其分頁核心邏輯包含三步:
Projections.rowCount())setFirstResult)與最大結果數(setMaxResults)public Page getPage(int currentPage, int pageSize, Criterion... crts) {
Criteria criteria = session.createCriteria(House.class);
// 動態添加查詢條件
for (Criterion criterion : crts) {
criteria.add(criterion);
}
// 1. 查詢總記錄數
criteria.setProjection(Projections.rowCount());
int totalRecord = Integer.valueOf(criteria.uniqueResult().toString());
// 2. 執行分頁查詢
criteria.setProjection(null); // 必須清除投影
criteria.setFirstResult((currentPage - 1) * pageSize);
criteria.setMaxResults(pageSize);
List list = criteria.list();
// 3. 封裝分頁對象
Page page = new Page();
page.setCurrentPage(currentPage);
page.setPageSize(pageSize);
page.setTotalRecord(totalRecord);
page.setList(list);
return page;
}
setProjection(null)HQL 接近 SQL 風格,適合複雜關聯查詢、自定義選列等場景。分頁邏輯同樣遵循「先查總數、後查數據」模式,但需手動構建計數 HQL。
public Page getPage(int currentPage, int pageSize, String hql, Object... args) {
// 1. 構建計數 HQL:從 from 關鍵字截取
String countHql = "select count(*) " + hql.substring(hql.indexOf("from"));
Session session = HibernateUtil.getInstance().getSession();
// 2. 查詢總記錄數
Query countQuery = session.createQuery(countHql);
for (int i = 0; i < args.length; i++) {
countQuery.setParameter(i, args[i]);
}
int totalRecord = Integer.valueOf(countQuery.uniqueResult() + "");
// 3. 執行分頁查詢
Query dataQuery = session.createQuery(hql);
for (int i = 0; i < args.length; i++) {
dataQuery.setParameter(i, args[i]);
}
dataQuery.setFirstResult(pageSize * (currentPage - 1));
dataQuery.setMaxResults(pageSize);
List<House> list = (List<House>) dataQuery.list();
// 4. 封裝結果
Page page = new Page();
page.setCurrentPage(currentPage);
page.setPageSize(pageSize);
page.setTotalRecord(totalRecord);
page.setList(list);
return page;
}
?)或命名參數(:name)防注入substring 易失效(如含子查詢),建議用解析器或手寫計數語句| 維度 | Criteria API | HQL |
|---|---|---|
| 類型安全 | ✅ 編譯期檢查 | ❌ 運行期報錯 |
| 動態條件 | ✅ 極佳 | ⚠️ 字符串拼接繁瑣 |
| 複雜查詢 | ⚠️ API 複雜 | ✅ 靈活強大 |
| 維護成本 | 低(重構友好) | 高(字符串易出錯) |
| 適用場景 | 後台管理、多條件篩選 | 報表統計、複雜業務邏輯 |
BaseDao 方法,業務層僅傳參掌握這兩種分頁核心模式,能讓你在面對不同業務複雜度時,游刃有餘地實現高性能、可維護的分頁查詢功能。