HQL (Hibernate Query Language) 是面向物件的查詢語言,操作實體類與屬性而非資料表欄位,支援繼承、多型,是 Hibernate 最常用的查詢方式。
Query query = session.createQuery("HQL語句");
List<Object> list = query.list(); // 執行查詢,返回 List
// 簡單查詢所有商品 from Commodity
懶加載行為:預設關聯屬性(如 commodity.seller)不會立即查詢,首次存取時觸發額外 SQL(N+1 問題)。可用 fetch join 優化。
select c.name, s.name from Commodity c join c.seller s
每行為 Object[],索引對應 select 項順序。
select c.name from Commodity c
單欄查詢直接返回型別列表,無需陣列包裝。
select new map(c.name as name, s.name as sellerName) from Commodity c join c.seller s
鍵為別名(或索引),值為對應屬性值。
步驟:
public CommodityDTO(String name, String sellerName) { ... }select new com.example.dto.CommodityDTO(c.name, s.name) from Commodity c join c.seller sList<CommodityDTO>,型別安全。注意:添加自定義構造函數後,必須保留無參構造函數,Hibernate 實體化時需要。
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();
}
Commodity ≠ COMMODITY)。from Commodity 可省略包名,Hibernate 根據映射檔自動解析。:param 或位置參數 ?,防注入:query.setParameter("name", "Apple");query.setFirstResult(0).setMaxResults(10);