我有一个 Order
类,它有一个列表 OrderTransactions
我用一对多的 Hibernate 映射映射它,如下所示:
@OneToMany(targetEntity = OrderTransaction.class, cascade = CascadeType.ALL)
public List<OrderTransaction> getOrderTransactions() {
return orderTransactions;
}
这些 Order
也有一个字段 orderStatus
,用于使用以下条件进行过滤:
public List<Order> getOrderForProduct(OrderFilter orderFilter) {
Criteria criteria = getHibernateSession()
.createCriteria(Order.class)
.add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow()));
return criteria.list();
}
这有效,结果符合预期。
现在 这是我的问题:为什么当我将获取类型明确设置为 EAGER
时, Order
在结果列表中出现多次?
@OneToMany(targetEntity = OrderTransaction.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
public List<OrderTransaction> getOrderTransactions() {
return orderTransactions;
}
我将如何更改我的 Criteria 代码以使用新设置达到相同的结果?
原文由 raoulsson 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果我正确理解您的配置,这实际上是预期的行为。
您在任何结果中得到相同的
Order
实例,但由于现在您正在与OrderTransaction
进行连接,它必须返回与常规 sql 连接相同数量的结果返回所以实际上它 应该 出现多次。作者 (Gavin King) 在这里 对此进行了很好的解释:它既解释了原因,又解释了如何仍然获得不同的结果
在 Hibernate [FAQ][2] 中也提到: