首頁  >  文章  >  Java  >  為什麼 Hibernate Criteria 使用 FetchType.EAGER 傳回重複的訂單?

為什麼 Hibernate Criteria 使用 FetchType.EAGER 傳回重複的訂單?

Barbara Streisand
Barbara Streisand原創
2024-10-26 01:40:28659瀏覽

Why Does Hibernate Criteria Return Duplicate Orders with FetchType.EAGER?

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)

    [Gavin King 對SQL 外連接和Hibernate 行為的解釋](http ://www.hibernate.org/42.html)

以上是為什麼 Hibernate Criteria 使用 FetchType.EAGER 傳回重複的訂單?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn