如何使用fetch =" join"在hbm文件中?

时间:2014-09-13 10:49:42

标签: hibernate fetching-strategy

在此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",但它没有成功。什么出错?

1 个答案:

答案 0 :(得分:1)

一般来说,你是对的 - 正如文件中所述:

5.1.7. Mapping one to one and one to many associations

小引用:

  

...但您可以调整提取策略,即使用@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

来做到这一点

16.3. Associations and joins

来自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);