首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Hibernate HQL 關聯查詢:多對一關聯下的高效寫法

     編輯:程式設計綜合問答

實體 Discuss 多對一關聯 Post(外鍵 postid)。需根據 Post.postid 查詢對應的 Discuss 列表。

推薦寫法:直接導航屬性查詢

FROM Discuss d WHERE d.post.postid = :pid

Hibernate 會自動轉換為內連接 SQL。若 Discuss.post 設為 lazy=true(預設),查詢回傳的 Discuss 物件其 post 屬性為代理物件,首次存取時觸發二次查詢(N+1 問題)。

解決 N+1:抓取連接

FROM Discuss d JOIN FETCH d.post WHERE d.post.postid = :pid

JOIN FETCH 會在同一 SQL 以 INNER JOIN 撈回 Post 資料,避免後續存取觸發額外查詢。

替代寫法:明確內連接

SELECT d FROM Discuss d INNER JOIN d.post p WHERE p.postid = :pid

此寫法不預載 Post,若後續不需存取 d.post 則效能較好。

映射檔關鍵設定

<many-to-one name="post" class="Post" column="postid" lazy="proxy"/>
  • lazy="false":立即載入(不推薦,易造成過度抓取)。
  • lazy="proxy"(預設):延遲載入代理。
  • lazy="no-proxy":需位元組碼增強。

總結選擇指南

  • 只需 Discuss 欄位 → WHERE d.post.postid = ?
  • 同時需 Post 欄位 → JOIN FETCH 或 INNER JOIN ... SELECT d, p
  • 僅統計/檢查存在 → SELECT COUNT(d) FROM Discuss d WHERE d.post.postid = ?
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved