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

Hibernate 3 學習筆記(九):HQL 查詢進階與 Query API 詳解

     編輯:Java 相關知識

HQL 核心優勢

HQL(Hibernate Query Language)面向對象、支持多態、與數據庫無關,是官方推薦的查詢方式。通過 Session.createQuery() 創建 Query 實例執行。

多樣化查詢示例

1. 基礎查詢與排序

Query q = session.createQuery(
    "from User user order by user.age desc, user.name");
List users = q.list();

2. 投影查詢與 DTO 映射

// 構造函數表達式 new Package.Class(prop1, prop2)
Query q = session.createQuery(
    "select new com.hb3.pack_01.model.UserBak(user.name, user.age) from User user");
List dtos = q.list();

3. 聚合函數與分組

// 平均年齡
Query q = session.createQuery("select avg(user.age) from User user");

// 分組統計
Query q = session.createQuery(
    "select user.sex, avg(user.age) from User user group by user.sex");

// Having 過濾
Query q = session.createQuery(
    "select user.sex, avg(user.age) from User user group by user.sex having avg(user.age) > 20");

4. 參數綁定(命名/位置)

// 位置參數
Query q = session.createQuery("from User where age > ?");
q.setInteger(0, 25);

// 命名參數(推薦)
Query q = session.createQuery("from User where age > :minAge");
q.setInteger("minAge", 25);

5. 批量更新/刪除(HQL 直接執行)

Transaction tx = session.beginTransaction();

// 更新
Query q = session.createQuery("update User set age=24 where name='chenyan'");
int updated = q.executeUpdate();

// 刪除
q = session.createQuery("delete User where name='yaobin'");
int deleted = q.executeUpdate();

tx.commit();

6. 命名查詢(映射文件預定義)

<query name="User.QueryUser">
    <![CDATA[from User user where user.age > :minAge]]>
</query>

// 調用
Query q = session.getNamedQuery("User.QueryUser");
q.setInteger("minAge", 25);

常用條件構造

操作HQL 示例
範圍age between 20 and 30
集合包含name in ('A', 'B')
模糊匹配name like 'cat%'
統計函數count(*), sum(age), max(age)

注意事項

  • HQL 大小寫不敏感(關鍵字),但屬性名敏感
  • 批量操作不觸發攔截器/生命周期回調
  • 複雜查詢考慮使用 Criteria 或原生 SQL
  • 避免在循環中執行查詢,使用批量獲取策略
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved