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

Hibernate 多表關聯查詢實戰:HQL 跨表查詢與結果處理

     編輯:Java 相關知識

Hibernate 與 JDBC 差異回顧

  • Hibernate 是 JDBC 的輕量級物件封裝,獨立於 App Server 與 EJB。
  • 相容性取決於 JDBC 驅動與資料庫,與 Java 程式碼本身無關。
  • 定位為 JDBC 替代方案,非 Entity Bean 競爭者。

HQL 多表查詢基礎

HQL 查詢多個實體時,結果為笛卡兒積(交叉連接)。語法:

from EntityA, EntityB
from EntityA a, EntityB b
from EntityA a, EntityB b where a.id = b.aId
  • 實體名稱**必須**與 Java 類別名完全一致(含大小寫)。
  • 別名建議遵循 Java 區域變數命名慣例(首字母小寫)。

完整範例:雙表關聯查詢與結果轉換

假設 tBookInfo(書籍)與 BookSelection(選書記錄)關聯,book.id = sel.bookId。

String hql = "from tBookInfo book, BookSelection sel where book.id = sel.bookId";
Collection result = new ArrayList();
Transaction tx = null;
try {
    Session session = HibernateUtil.currentSession();
    tx = session.beginTransaction();
    Query query = session.createQuery(hql);
    result = query.list();
    tx.commit();
} catch (Exception e) {
    throw e;
} finally {
    HibernateUtil.closeSession();
}

// 結果處理:每筆為 Object[],依 SELECT 順序對應實體
ArrayList list = (ArrayList) result;
Iterator it = list.iterator();
while (it.hasNext()) {
    Object[] row = (Object[]) it.next();
    tBookInfo book = (tBookInfo) row[0];
    BookSelection sel = (BookSelection) row[1];
    System.out.println("BookInfo-Title: " + book.getTitle());
    System.out.println("BookSelection-ID: " + sel.getId());
}

關鍵點總結

  1. HQL 針對**實體與屬性**查詢,非資料表與欄位。
  2. 多實體查詢回傳 List<Object[]>,需手動轉型。
  3. 善用 where 條件縮小笛卡兒積範圍,必要時改用 join fetch 優化效能。
  4. 交易管理(beginTransaction/commit/close)不可省略。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved