HQL 查詢多個實體時,結果為笛卡兒積(交叉連接)。語法:
from EntityA, EntityB
from EntityA a, EntityB b
from EntityA a, EntityB b where a.id = b.aId
假設 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());
}
List<Object[]>,需手動轉型。where 條件縮小笛卡兒積範圍,必要時改用 join fetch 優化效能。beginTransaction/commit/close)不可省略。