標準 Criteria 必須在打開的 Session 中創建(session.createCriteria()),無法在 Session 外部預構建查詢條件,限制了復用性。Hibernate 3 引入 DetachedCriteria 解決此問題。
DetachedCriteria.forClass(User.class)detached.getExecutableCriteria(session)import org.hibernate.*;
import org.hibernate.criterion.*;
public class DetachedCriteriaDemo {
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
// 1. 離線構建查詢條件(無需 Session)
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
dc.add(Restrictions.ge("age", 20));
dc.addOrder(Order.desc("age"));
Session session = sf.openSession();
try {
// 2. 綁定 Session 獲取可執行 Criteria
Criteria criteria = dc.getExecutableCriteria(session);
// 3. 執行查詢
List users = criteria.list();
for (User u : users) {
System.out.println(u.getId() + "\t" + u.getName() + "/" + u.getAge());
}
} finally {
session.close();
sf.close();
}
}
}
Subqueries.propertyEq("id", detachedCriteria)| 特性 | Criteria | DetachedCriteria |
|---|---|---|
| 創建依賴 | Session | 無 |
| 線程安全 | 否 | 是(構建階段) |
| 執行方式 | 直接 list() | 先 getExecutableCriteria() |
| 適用場景 | 簡單即時查詢 | 復用、分層、序列化 |