在此question中,我希望使用fetch="join"
通过单个选择查询来检索集合。我在user.hbm文件上做了以下更改。
<set name="phones" table="PHONE_NUMBERS" cascade="all"
lazy="false" fetch="join">
<key column="UNID"/>
<one-to-many class="PhoneNumber"/>
</set>
但仍会触发多个查询。我也尝试在两个hbms上添加fetch="join"
,但它没有成功。什么出错?
答案 0 :(得分:1)
一般来说,你是对的 - 正如文件中所述:
小引用:
...但您可以调整提取策略,即使用@Fetch获取数据的方式。 FetchMode可以是SELECT(当需要加载关联时触发select)或JOIN(使用SQL JOIN在加载所有者实体时加载关联)。 JOIN覆盖任何延迟属性(通过JOIN策略加载的关联不能是懒惰的)...
但是referenced question above正在让你的根实体 USER 像这样:
String hql = "from User ";
Query q = ses.createQuery(hql);
这意味着,您正在查询User
。在这种情况下,不评估映射fetch="join"
。
我们可以通过显式JOIN
来做到这一点来自doc的一个例子:
from Cat as cat
join cat.mate as mate
left join cat.kittens as kitten
所以在我们的案例中:
String hql = "from User as u join u.phones as p ";
Query q = ses.createQuery(hql);
最后 - 只要我们拨打 fetch="join"
.get()
User user = session.get(id);