首页  >  文章  >  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 返回重复订单

考虑以下 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 时,结果列表包含重复订单。

原因对于重复项

使用 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