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);
追加リソース
この動作の詳細については、次のリソースを参照してください:
以上がHibernate 条件が FetchType.EAGER で重複した注文を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。