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

Hibernate 學習筆記:查詢策略全解析

     編輯:Java 綜合教學

一、Get vs Load

  • get():立即檢索,返回實體或 null
  • load():延遲檢索(代理),無數據拋出 ObjectNotFoundException
  • 若 <class lazy="false">,load 也立即檢索
public void LazyTest() {
    Tb_User u = session.load(Tb_User.class, "1");
    // System.out.println(u.getName()); // 觸發查詢
}

二、一對多/多對多集合查詢優化

1. <set> 的 lazy 屬性

  • true(預設):延遲加載
  • false:立即加載
  • extra:極度延遲,size()/contains() 不初始化集合,只發 SQL 統計

2. batch-size:批量初始化

指定一次預加載集合元素數量,減少 SQL 次數。

3. fetch 屬性:集合初始化方式

  • select(預設):單獨查詢
  • subselect:子查詢一次加載所有集合,lazy 有效,batch-size 失效
  • join:左外連接,lazy 失效,HQL 查詢會忽略此設定

三、多對一查詢配置

  • many-to-one 的 lazy:proxy(延遲)、no-proxy、false(立即)
  • fetch:select 或 join
  • batch-size 放在 1 方的 <class> 標籤,非 many-to-one

四、HQL 查詢實戰

1. 基本步驟

Query query = session.createQuery("FROM Tb_User WHERE name = ? AND id = ?");
query.setParameter(0, "1");
query.setParameter(1, "1");
List<Tb_User> list = query.getResultList();

支持位置參數 ? 與命名參數 :name。

2. 分頁查詢

query.setFirstResult((pageNo - 1) * pageSize).setMaxResults(pageSize);

3. 命名查詢

在映射文件 <query name="findUserByName"><![CDATA[FROM Tb_User WHERE name = :name]]></query>,代碼調用 session.getNamedQuery("findUserByName")。

4. 投影查詢

// 返回 List<Object[]>
SELECT a.id, a.name FROM Tb_User a
// 構造函數返回 List<Tb_User>
SELECT new Tb_User(a.id, a.name) FROM Tb_User a

5. 報表查詢(聚合)

SELECT min(a.money), max(a.money) FROM Tb_Order a GROUP BY a.user

6. 連接查詢

  • LEFT JOIN FETCH:立即初始化集合,可能重複,用 DISTINCT 或 LinkedHashSet 去重
  • LEFT JOIN:返回 Object[],不初始化集合,需映射文件配合
  • INNER JOIN:不返回無匹配記錄(如無訂單用戶)

五、QBC (Criteria API) 面向對象查詢

Criteria criteria = session.createCriteria(Tb_User.class);
criteria.add(Restrictions.eq("id", "1"));
Tb_User u = (Tb_User) criteria.uniqueResult();

支持 Conjunction (AND)、Disjunction (OR)、投影統計 Projections.max()、分頁等。

六、原生 SQL 查詢

// 查詢
session.createSQLQuery("select * from Tb_User where name = :name")
       .setParameter("name", "1").getResultList();
// 執行更新
session.createSQLQuery("insert into Tb_User(id,name) values (:id,:name)")
       .setParameter("id", uuid).setParameter("name", uuid).executeUpdate();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved