假设项目和出价是实体:一个项目有很多出价。它们以典型的父/子关系映射到 hibernate 中:

<class name="Item" table="ITEM">
  ...
  <set name="bids" inverse="true">
    <key column="ITEM_ID"/>
    <one-to-many class="Bid"/>
  </set>
</class>

在执行此查询后尝试访问每个项目的出价时,如何避免n + 1个选择?

List<Item> items = session.createCriteria(Item.class)
                        .createAlias("bids", "b").
                        .add(Restrictions.gt("b.amount", 100)).
                        .list();

请注意,我需要急于获取出价,但是需要对集合进行进一步限制(b.amount> 100)

我尝试了以下失败:

List<Item> items = session.createCriteria(Item.class)
                        .setFetchMode("bids", FetchMode.JOIN).
                        .createAlias("bids", "b").
                        .add(Restrictions.gt("b.amount", 100)).
                        .list();

List<Item> items = session.createCriteria(Item.class)
                        .createCriteria("bids")
                        .add(Restrictions.gt("amount", 100)).
                        .list();

最佳答案

此条件查询似乎正确:

  List<Item> items = session.createCriteria(Item.class)
                    .setFetchMode("bids", FetchMode.JOIN)
                    .createAlias("bids", "b")
                    .add(Restrictions.gt("b.amount", 100))
                    .list();
FetchMode.JOIN旨在解决n+1问题。您是否定义了default_batch_fetch_size |映射或配置中任何位置的batch-size,这会产生反向影响吗?

如果没有,您可以在HQL下方尝试一下,看看是否可以解决您的问题?
 Query query =
      session.createQuery("from Item it left join it.bids b where b.amount=:bids");
 query.setParamter(bids, 100);
 List<Item> items = query.list();

关于java - 标准渴望获取联接集合,以避免n + 1个选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12790080/

10-08 22:53