首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Hibernate 3 學習筆記(七):Criteria 查詢 API 全方位解析

     編輯:Java 相關知識

Criteria API 核心優勢

Criteria 提供完全面向對象的查詢構建方式,支持動態組裝條件、編譯時類型檢查、自動處理別名,是構建複雜動態查詢的首選。

Restrictions 條件構建大全

方法SQL 對應示例
eq/ne= / !=Restrictions.eq("age", 25)
gt/ge/lt/le> / >= / < / <=Restrictions.gt("age", 20)
betweenBETWEENRestrictions.between("age", 20, 30)
likeLIKERestrictions.like("name", "Zhang%")
in/notInIN / NOT INRestrictions.in("id", ids)
isNull/isNotNullIS NULLRestrictions.isNull("age")
and/orAND / ORRestrictions.or(c1, c2)
sqlRestriction原生 SQL 片段Restrictions.sqlRestriction("{alias}.name LIKE ?", "%ya%", Hibernate.STRING)

進階查詢技巧

1. 排序與分頁

Criteria c = session.createCriteria(User.class);
c.addOrder(Order.asc("age")).addOrder(Order.desc("name"));
c.setFirstResult(3);  // 跳過前 3 條
c.setMaxResults(2);   // 取 2 條

2. 投影與聚合

// 行數
c.setProjection(Projections.rowCount());

// 平均年齡
c.setProjection(Projections.avg("age"));

// 分組
c.setProjection(Projections.groupProperty("age"));

// 多列投影
ProjectionList pl = Projections.projectionList();
pl.add(Projections.groupProperty("age"));
pl.add(Projections.groupProperty("name"));
pl.add(Projections.rowCount());
c.setProjection(pl);

3. 關聯查詢(嵌套 Criteria)

// Room 一對多 User,查詢擁有年齡 30 歲用戶的房間
Criteria roomCrit = session.createCriteria(Room.class);
Criteria userCrit = roomCrit.createCriteria("users");
userCrit.add(Restrictions.eq("age", 30));
List rooms = roomCrit.list();

4. 動態條件組裝

Criteria c = session.createCriteria(User.class);
if (name != null) c.add(Restrictions.like("name", name + "%"));
if (minAge != null) c.add(Restrictions.ge("age", minAge));
if (maxAge != null) c.add(Restrictions.le("age", maxAge));

5. Example 查詢(QBE)

User example = new User();
example.setAge(26);
Criteria c = session.createCriteria(User.class);
c.add(Example.create(example)
    .enableLike()           // 字符串模糊匹配
    .ignoreCase()           // 忽略大小寫
    .excludeZeroes());      // 排除零值

Property API 類型安全查詢

// 類型安全的屬性引用
c.add(Property.forName("name").like("%ya%"));
c.addOrder(Property.forName("age").desc());

運行結果解讀

示例輸出展示了各查詢生成的 SQL 及結果集,驗證了 Criteria 與 HQL 的等價性,且 Criteria 更適合動態構建場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved