首页 > Java > java教程 > 正文

为什么 Hibernate Criteria 使用 FetchType.EAGER 返回重复的订单?

Barbara Streisand
发布: 2024-10-26 01:40:28
原创
668 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!