Hibernate Criteria 使用FetchType.EAGER 返回重複訂單
問題:
設置時將訂單的orderTransactions 清單的類型取得為FetchType.EAGER,為什麼訂單在使用Criteria 檢索到的結果清單中出現多次?
答案:
此行為是預期的。使用 FetchType.EAGER,執行連線以急切地取得 orderTransactions。這會產生與標準 SQL 連線相同數量的結果,其中每個訂單都會出現在每個對應 orderTransaction 的結果集中。
要理解這一點,請考慮產生的SQL 語句:
SELECT o.*, l.* from ORDER o LEFT OUTER JOIN LINE_ITEMS l ON o.ID = l.ORDER_ID
在該語句中,對於每個訂單,都會檢索所有相關的訂單項,從而導致結果集中出現同一訂單的多個實例。
取得不同結果的解決方案:
要使用FetchType.EAGER 過濾掉重複結果,可以使用維護插入順序的Collection 類型,例如LinkedHashSet:
Collection<Order> result = new LinkedHashSet( session.createCriteria(Order.class) .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow())) .list() );
以上是## 為什麼 Hibernate Criteria 使用 FetchType.EAGER 回傳重複訂單?的詳細內容。更多資訊請關注PHP中文網其他相關文章!