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 |
FROM Order -- 相當於 SELECT * FROM orders
FROM Order o, Product p -- 笛卡爾積
FROM Order AS o INNER JOIN o.products AS p -- 關聯導航(一對多)
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[] 集合
SELECT o FROM Order o WHERE o.id = '1234'
SELECT o FROM Order o WHERE o.priceTotal > :min AND o.priceTotal < :max -- 命名參數
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
SELECT COUNT(o) FROM Order o
WHERE o.priceTotal >= 1200 AND o.priceTotal <= 3200
GROUP BY o.id
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();
}
}
}
SELECT/select),但Java 類名、屬性名嚴格區分大小寫(Order ≠ order)。com.example.Order)。LEFT JOIN FETCH 解決 N+1 問題:FROM Order o LEFT JOIN FETCH o.productsquery.setFirstResult(0).setMaxResults(20)FROM Order o WHERE o.id IN (SELECT o2.id FROM Order o2 WHERE o2.total > 1000)SELECT new com.example.OrderSummary(o.id, o.total) FROM Order oHQL 將 SQL 的強大與面向對象的優雅完美融合。掌握投影、約束、聚合、分組四大核心,配合關聯導航與參數綁定,即可應對 90% 的業務查詢場景。記住:思考對象圖,而非表結構。