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 Criteria 使用 FetchType.EAGER 返回重复的订单?的详细内容。更多信息请关注PHP中文网其他相关文章!