ホームページ  >  記事  >  Java  >  Hibernate 条件が FetchType.EAGER で重複した注文を返すのはなぜですか?

Hibernate 条件が FetchType.EAGER で重複した注文を返すのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-26 01:40:28659ブラウズ

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

Hibernate Criteria Returns Duplicate Orders with FetchType.EAGER

次の Hibernate マッピングを考えてみましょう。

@OneToMany(targetEntity = OrderTransaction.class, cascade = CascadeType.ALL)
public List<OrderTransaction> getOrderTransactions() {
    return orderTransactions;
}

これを使用してマッピングでは、orderStatus フィールドを使用して注文をフィルタリングできます。

public List<Order> getOrderForProduct(OrderFilter orderFilter) {
    Criteria criteria = getHibernateSession()
            .createCriteria(Order.class)
            .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow()));
    return criteria.list();
}

ただし、フェッチ タイプが明示的に EAGER に設定されている場合、結果のリストには重複した注文が含まれます。

理由for Duplicates

FetchType.EAGER を使用すると、Hibernate は結合操作を実行して、関連する OrderTransaction を積極的にフェッチします。その結果、結果のリスト内の各注文は、関連するすべての OrderTransaction に対して複製されます。これは、このシナリオで予期される動作です。

明確な結果の達成

熱心なフェッチにもかかわらず明確な注文を取得するには、条件クエリで次のコードを利用できます。

Criteria criteria = getHibernateSession()
            .createCriteria(Order.class, "o")
            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

追加リソース

この動作の詳細については、次のリソースを参照してください:

  • [Distinct に関する Hibernate FAQ外部結合フェッチの結果](https://docs.jboss.org/hibernate/orm/5.3/javadocs/faq/FAQ.html#ch02s01)
  • [SQL 外部結合と Hibernate の動作に関する Gavin King の説明](http://www.hibernate.org/42.html)

以上がHibernate 条件が FetchType.EAGER で重複した注文を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。