1

在这个问题中,我想通过使用单个选择查询来检索集合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>

但它仍然会触发多个查询。我也尝试添加fetch="join"两个hbms,但没有成功。怎么了?

4

1 回答 1

1

一般来说,您是对的 - 如文档中所述:

5.1.7。映射一对一和一对多关联

小引用:

...但是您可以调整获取策略,即使用@Fetch 获取数据的方式。FetchMode 可以是 SELECT(需要加载关联时触发选择)或 JOIN(在加载所有者实体时使用 SQL JOIN 加载关联)。JOIN 覆盖任何惰性属性(通过 JOIN 策略加载的关联不能是惰性的)...

但是,上面提到的问题是让你的根实体USER像这样:

String hql = "from User ";
Query q = ses.createQuery(hql);

这意味着,您正在查询User. 在这种情况下,fetch="join"不评估映射。

我们可以通过显式 JOIN 来做到这一点

16.3. 关联和连接

来自文档的示例:

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);
于 2014-09-13T11:15:08.967 回答