Criteria 提供完全面向對象的查詢構建方式,支持動態組裝條件、編譯時類型檢查、自動處理別名,是構建複雜動態查詢的首選。
| 方法 | SQL 對應 | 示例 |
|---|---|---|
eq/ne | = / != | Restrictions.eq("age", 25) |
gt/ge/lt/le | > / >= / < / <= | Restrictions.gt("age", 20) |
between | BETWEEN | Restrictions.between("age", 20, 30) |
like | LIKE | Restrictions.like("name", "Zhang%") |
in/notIn | IN / NOT IN | Restrictions.in("id", ids) |
isNull/isNotNull | IS NULL | Restrictions.isNull("age") |
and/or | AND / OR | Restrictions.or(c1, c2) |
sqlRestriction | 原生 SQL 片段 | Restrictions.sqlRestriction("{alias}.name LIKE ?", "%ya%", Hibernate.STRING) |
Criteria c = session.createCriteria(User.class);
c.addOrder(Order.asc("age")).addOrder(Order.desc("name"));
c.setFirstResult(3); // 跳過前 3 條
c.setMaxResults(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);
// Room 一對多 User,查詢擁有年齡 30 歲用戶的房間
Criteria roomCrit = session.createCriteria(Room.class);
Criteria userCrit = roomCrit.createCriteria("users");
userCrit.add(Restrictions.eq("age", 30));
List rooms = roomCrit.list();
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));
User example = new User();
example.setAge(26);
Criteria c = session.createCriteria(User.class);
c.add(Example.create(example)
.enableLike() // 字符串模糊匹配
.ignoreCase() // 忽略大小寫
.excludeZeroes()); // 排除零值
// 類型安全的屬性引用
c.add(Property.forName("name").like("%ya%"));
c.addOrder(Property.forName("age").desc());
示例輸出展示了各查詢生成的 SQL 及結果集,驗證了 Criteria 與 HQL 的等價性,且 Criteria 更適合動態構建場景。