假设 Item 和 Bid 是实体:一个 Item 有多个 Bid。它们被映射到休眠在典型的父子关系中:
<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();
Note我需要一个急于获取投标但对收集有进一步的限制(b.金额 > 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)