實體 Discuss 多對一關聯 Post(外鍵 postid)。需根據 Post.postid 查詢對應的 Discuss 列表。
FROM Discuss d WHERE d.post.postid = :pid
Hibernate 會自動轉換為內連接 SQL。若 Discuss.post 設為 lazy=true(預設),查詢回傳的 Discuss 物件其 post 屬性為代理物件,首次存取時觸發二次查詢(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, pSELECT COUNT(d) FROM Discuss d WHERE d.post.postid = ?