【问题标题】:how to Use fetch="join" in hbm file?如何在 hbm 文件中使用 fetch="join"?
【发布时间】:2014-11-07 11:15:08
【问题描述】:

在这个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",但没有成功。怎么了?

【问题讨论】:

    标签: hibernate fetching-strategy


    【解决方案1】:

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

    5.1.7. Mapping one to one and one to many associations

    小引:

    ... 但是,您可以调整获取策略,即使用@Fetch 获取数据的方式。 FetchMode 可以是 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

    来自文档的示例:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-26
      • 2019-06-02
      • 2015-07-17
      • 1970-01-01
      • 2020-02-29
      • 2018-11-06
      • 1970-01-01
      • 2012-12-13
      相关资源
      最近更新 更多