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

Hibernate HQL 查詢全攻略:from、select、order by、自定義構造函數回傳

     編輯:Java 綜合教學

Hibernate HQL 查詢全攻略:from、select、order by、自定義構造函數回傳

HQL (Hibernate Query Language) 是面向物件的查詢語言,操作實體類與屬性而非資料表欄位,支援繼承、多型,是 Hibernate 最常用的查詢方式。

一、核心介面:Query

Query query = session.createQuery("HQL語句");
List<Object> list = query.list(); // 執行查詢,返回 List

二、from 子句:查詢實體

// 簡單查詢所有商品
from Commodity

懶加載行為:預設關聯屬性(如 commodity.seller)不會立即查詢,首次存取時觸發額外 SQL(N+1 問題)。可用 fetch join 優化。

三、select 子句:靈活投影

1. 返回 Object[](預設)

select c.name, s.name from Commodity c join c.seller s

每行為 Object[],索引對應 select 項順序。

2. 返回單一屬性 → List<String> 而非 Object[]

select c.name from Commodity c

單欄查詢直接返回型別列表,無需陣列包裝。

3. 返回 Map

select new map(c.name as name, s.name as sellerName) from Commodity c join c.seller s

鍵為別名(或索引),值為對應屬性值。

4. 返回自定義型別(DTO)

步驟:

  1. 在實體類或 DTO 類定義全參構造函數:
    public CommodityDTO(String name, String sellerName) { ... }
  2. HQL 呼叫構造函數:
    select new com.example.dto.CommodityDTO(c.name, s.name) from Commodity c join c.seller s
  3. 查詢結果直接為 List<CommodityDTO>,型別安全。

注意:添加自定義構造函數後,必須保留無參構造函數,Hibernate 實體化時需要。

四、order by 子句:多欄位排序

from Commodity c join c.seller s
order by s.id asc, c.price desc, c.name asc

先按賣家 ID 升序,價格降序,名稱升序。

五、完整測試範例

@Test
public void testHQL() {
    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();

    // 1. 基本查詢
    List<Commodity> list = session.createQuery("from Commodity").list();

    // 2. 投影查詢 Object[]
    List<Object[]> rows = session.createQuery(
        "select c.name, s.name from Commodity c join c.seller s").list();

    // 3. Map 返回
    List<Map> maps = session.createQuery(
        "select new map(c.name as name, s.name as seller) from Commodity c join c.seller s").list();

    // 4. DTO 返回
    List<CommodityDTO> dtos = session.createQuery(
        "select new com.example.dto.CommodityDTO(c.name, s.name) from Commodity c join c.seller s").list();

    // 5. 排序
    List<Commodity> sorted = session.createQuery(
        "from Commodity c order by c.seller.id asc, c.price desc").list();

    tx.commit();
    session.close();
}

六、HQL 關鍵注意事項

  • 大小寫敏感:實體類名、屬性名必須與 Java 類完全一致(Commodity ≠ COMMODITY)。
  • 自動導入:from Commodity 可省略包名,Hibernate 根據映射檔自動解析。
  • 參數綁定:使用命名參數 :param 或位置參數 ?,防注入:
    query.setParameter("name", "Apple");
  • 分頁:query.setFirstResult(0).setMaxResults(10);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved