【问题标题】:Hibernate Criteria: Eagerly load ManyToMany collectionHibernate 标准:急切地加载 ManyToMany 集合
【发布时间】:2010-01-06 10:48:30
【问题描述】:

我的问题对我来说似乎很简单,但我似乎无法找到有效的答案。我有一个休眠实体,它与另一个实体具有多对多关联,默认情况下会延迟获取。我想创建一个 Criteria,它将返回带有急切加载的 ManyToMany 关联的实体。

这是有问题的实体(删除了不相关的部分):

@Entity
public class Order {

  @ManyToMany
  private List<Item> items;

  @ManyToMany
  private List<Discount> discountEntries;

  ...

}

这是我迄今为止的显着尝试和结果:

Criteria criteria = getSession().createCriteria(Order.class)
                                .setFetchMode("items", FetchMode.SELECT)
                                .setFetchMode("discountEntries", FetchMode.SELECT);
criteria.list();

- 延迟加载项目

Criteria criteria = getSession().createCriteria(Order.class)
                                .setFetchMode("items", FetchMode.JOIN)
                                .setFetchMode("discountEntries", FetchMode.JOIN);
criteria.list();

- 无法提取多个包

Criteria criteria = getSession().createCriteria(Order.class)
                                .createAlias("items", "items", CriteriaSpecification.INNER_JOIN)
                                .setFetchMode("items", FetchMode.JOIN)
                                .createAlias("discountEntries", "discountEntries", CriteriaSpecification.INNER_JOIN)
                                .setFetchMode("discountEntries", FetchMode.JOIN);
criteria.list();

- 返回一个空列表

编辑:添加了另一个多对多关联,因为这似乎是问题的一部分。

【问题讨论】:

  • 我已经设法通过将列表更改为集合来使用 setFetchMode("items", FetchMode.JOIN) 实现这一点(这消除了“多袋”问题)。但是,这会导致外部连接和笛卡尔连接。我正在寻找一种使用子选择的方法...

标签: hibernate criteria fetch


【解决方案1】:

使用LAZY 设置获取集合和:

List list = criteria.list();
Hibernate.initialize(list);

这将立即初始化它,仅适用于这种情况。

【讨论】:

  • 添加到您的答案 - 这将导致外部联接,除非您在实体中的关联上使用 @Fetch(FetchMode.SUBSELECT)。
【解决方案2】:

您尝试了吗:@ManyToMany(fetch = FetchType.EAGER)?结果如何?

【讨论】:

  • 它正确加载项目 - 急切地,但我只想为一个标准执行此操作,而不是一直这样做。因此,我需要一些方法将它急切地加载到 Criteria 上。
猜你喜欢
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多