Hibernate 作為主流 ORM 框架,其核心優勢在於將物件模型與關係型資料庫無縫映射。本文通過完整實例,詳細演示 Hibernate 多表關聯查詢的 HQL 編寫、執行流程及結果集處理技巧。
.hbm.xml 或註解定義實體類與資料表的對應Object[] 陣列或 List<Object[]>// 基本語法:從多個實體類查詢,類名區分大小寫
from Student, Book
from Student as stu, Book as boo
from Student stu, Book boo // 別名建議首字母小寫,符合 Java 命名規範
場景:查詢圖書資訊(tBookInfo)與選書記錄(BookSelection)的關聯數據
String hql = "from tBookInfo book, BookSelection sel where book.id = sel.bookId";
List result = new ArrayList();
Transaction tx = null;
try {
Session session = HibernateUtil.currentSession();
tx = session.beginTransaction();
Query query = session.createQuery(hql); // 注意:變數名為 hql 而非 sql
result = query.list();
tx.commit();
} catch (Exception e) {
if (tx != null) tx.rollback();
throw e;
} finally {
HibernateUtil.closeSession();
}
// 結果集處理:每行是 Object[2],對應 book 和 sel
for (Object[] row : result) {
tBookInfo bookInfo = (tBookInfo) row[0];
BookSelection bookSelect = (BookSelection) row[1];
System.out.println("書名: " + bookInfo.getTitle());
System.out.println("選書ID: " + bookSelect.getId());
}
as 關鍵字或直接空格分隔,別名首字母小寫setFirstResult/setMaxResults)或投影查詢(select book.title, sel.id ...)對於複雜關聯,可考慮使用 fetch join 減少 N+1 查詢問題,或採用 Criteria API 構建動態查詢。合理設計實體關聯映射(@OneToMany、@ManyToOne)配合懶加載策略,是效能優化的根本。