假设项目和出价是实体:一个项目有很多出价。它们以典型的父/子关系映射到 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/