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

Hibernate HQL 入門指南:面向對象查詢語言全解析

     編輯:Java 相關知識

HQL 核心優勢:面向對象的 SQL

HQL (Hibernate Query Language) 語法類似 SQL,但查詢目標是持久化對象而非數據庫表。它完整支持繼承、多態、關聯導航,讓你用對象思維寫查詢,由 Hibernate 自動翻譯為優化 SQL。

四大核心查詢功能

類別功能示例
投影選擇對象/屬性FROM Order, SELECT o.id, p.name FROM Order o JOIN o.products p
約束過濾數據WHERE o.id = '1234', HAVING o.priceTotal > 1000
聚合統計計算COUNT(*), AVG(price), MAX(o.priceTotal)
分組數據分組GROUP BY o.id

基礎查詢語法

1. FROM 子句:查詢所有實例

FROM Order                    -- 相當於 SELECT * FROM orders
FROM Order o, Product p       -- 笛卡爾積
FROM Order AS o INNER JOIN o.products AS p  -- 關聯導航(一對多)

2. SELECT 子句:投影屬性/對象

SELECT p FROM Order o JOIN o.products p           -- 返回 Product 對象集合
SELECT p.name FROM Order o JOIN o.products p      -- 返回 String 集合
SELECT o.id, p.name FROM Order o JOIN o.products p -- 返回 Object[] 集合

3. WHERE 子句:條件過濾

SELECT o FROM Order o WHERE o.id = '1234'
SELECT o FROM Order o WHERE o.priceTotal > :min AND o.priceTotal < :max  -- 命名參數

4. 聚合與 HAVING

SELECT MAX(o.priceTotal) + MAX(p.price) FROM Order o JOIN o.products p GROUP BY o.id
SELECT COUNT(o) FROM Order o HAVING o.priceTotal < 1000 GROUP BY o.id

5. 分組 GROUP BY

SELECT COUNT(o) FROM Order o 
WHERE o.priceTotal >= 1200 AND o.priceTotal <= 3200 
GROUP BY o.id

Java 代碼中執行 HQL

import org.hibernate.*;
import org.hibernate.cfg.*;
import java.util.List;

public class OrderDao {
    private SessionFactory sf;

    public OrderDao() {
        Configuration cfg = new Configuration().addClass(Order.class);
        sf = cfg.buildSessionFactory();
    }

    public Order findByPriceRange(String lower, String upper) {
        Session session = sf.openSession();
        try {
            String hql = "SELECT o FROM Order o JOIN o.products p " +
                         "WHERE o.priceTotal > :low AND o.priceTotal < :high";
            Query query = session.createQuery(hql);
            query.setDouble("low", Double.parseDouble(lower));
            query.setDouble("high", Double.parseDouble(upper));
            List<Order> list = query.list();
            return list.isEmpty() ? null : list.get(0);
        } finally {
            session.close();
        }
    }
}

兩大注意事項

  1. 大小寫敏感性:HQL 關鍵字不區分大小寫(SELECT/select),但Java 類名、屬性名嚴格區分大小寫(Order ≠ order)。
  2. 包名全限定:若實體類未在映射文件中指定包名,HQL 中需使用全限定名(如 com.example.Order)。

進階提示

  • 使用 LEFT JOIN FETCH 解決 N+1 問題:FROM Order o LEFT JOIN FETCH o.products
  • 分頁查詢:query.setFirstResult(0).setMaxResults(20)
  • 子查詢:FROM Order o WHERE o.id IN (SELECT o2.id FROM Order o2 WHERE o2.total > 1000)
  • 動態實例化 DTO:SELECT new com.example.OrderSummary(o.id, o.total) FROM Order o

總結

HQL 將 SQL 的強大與面向對象的優雅完美融合。掌握投影、約束、聚合、分組四大核心,配合關聯導航與參數綁定,即可應對 90% 的業務查詢場景。記住:思考對象圖,而非表結構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved