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

Hibernate 3 學習筆記(八):DetachedCriteria 離線查詢實戰

     編輯:Java 相關知識

痛點:Criteria 與 Session 綁定

標準 Criteria 必須在打開的 Session 中創建(session.createCriteria()),無法在 Session 外部預構建查詢條件,限制了復用性。Hibernate 3 引入 DetachedCriteria 解決此問題。

DetachedCriteria 核心特性

  • 無需 Session 即可創建:DetachedCriteria.forClass(User.class)
  • 支持完整 Criteria API(Restrictions、Order、Projections 等)
  • 執行時綁定 Session:detached.getExecutableCriteria(session)
  • 可序列化,適合跨層傳遞(如 Web 層構建,Service 層執行)

完整示例

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();
        }
    }
}

應用場景

  • 查詢條件復用:基礎條件定義一次,多處執行
  • 分層架構:Web 層組裝條件,DAO 層執行
  • 序列化傳輸:遠程調用傳遞查詢規範
  • 子查詢構建:Subqueries.propertyEq("id", detachedCriteria)

對比總結

特性CriteriaDetachedCriteria
創建依賴Session無
線程安全否是(構建階段)
執行方式直接 list()先 getExecutableCriteria()
適用場景簡單即時查詢復用、分層、序列化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved