Hibernate Criteria 使用FetchType.EAGER 返回多個重複訂單
問題:
使用時具有FetchType.EAGER 的Hibernate Criteria 用於一對多關係,結果清單包含同一Order 物件的多個副本。
原始程式碼:
<code class="java">public List<OrderTransaction> getOrderTransactions() { return orderTransactions; }</code>
使用FetchType.EAGER 修改碼:
<code class="java">public List<OrderTransaction> getOrderTransactions() { return orderTransactions; }</code>
問題:
為什麼使用FetchType.EAGER 修改程式碼會導致多個Order 物件的副本?
答案:
啟用急切獲取時會出現此行為。在 Order 和 OrderTransaction 表之間執行聯接,產生與常規 SQL 聯結相同的行數。因此,每個 Order 物件出現多次,對應於相關 OrderTransaction 記錄的數量。
說明:
使用 FetchType.EAGER 取得資料時使用了外連接。這意味著即使一個Order沒有相關的OrderTransaction記錄,它仍然會包含在結果集中。結果是 Order 物件的列表,每個物件都可能與多個 OrderTransaction 物件關聯。
解決方案:
要避免 Order 物件的多個副本,請考慮使用集合而不是列表以防止重複。或者,在 Criteria 查詢中使用 DistinctRootEntity,它明確指定要傳回的不同 Order 物件。
範例:
<code class="java">Criteria criteria = getHibernateSession() .createCriteria(Order.class) .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow()));</code>
以上是## 為什麼使用 FetchType.EAGER 的 Hibernate Criteria 會導致重複的訂單物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!