Hibernate Criteria 使用FetchType.EAGER 傳回重複訂單
考慮下列對應時,您可以使用orderStatus 欄位過濾訂單:
@OneToMany(targetEntity = OrderTransaction.class, cascade = CascadeType.ALL) public List<OrderTransaction> getOrderTransactions() { return orderTransactions; }
但是,當取得類型明確設定為EAGER 時,結果清單包含重複訂單。
public List<Order> getOrderForProduct(OrderFilter orderFilter) { Criteria criteria = getHibernateSession() .createCriteria(Order.class) .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow())); return criteria.list(); }
原因對於重複項
使用 FetchType.EAGER,Hibernate 執行連接操作以急切地獲取關聯的 OrderTransactions。因此,結果清單中的每個訂單對於每個關聯的 OrderTransaction 都會重複。這是這種情況下的預期行為。
實現不同的結果
要在急切的情況下獲取不同的訂單,您可以在Criteria 查詢中使用以下程式碼:
其他資源Criteria criteria = getHibernateSession() .createCriteria(Order.class, "o") .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
有關此行為的更多見解,請參閱以下資源:
[Hibernate 關於Distinct 的常見問題解答外連接獲取的結果](https://docs.jboss.org/hibernate/orm/5.3/javadocs/faq/FAQ.html#ch02s01)
以上是為什麼 Hibernate Criteria 使用 FetchType.EAGER 傳回重複的訂單?的詳細內容。更多資訊請關注PHP中文網其他相關文章!