首页 文章

FetchType EAGER与Root fetch()不同?

提问于
浏览
1

我正在使用JPA 2 CriteriaBuilder构建查询,使用Hibernate 4作为我的提供者 . 我一直在玩FetchModes,并得出结论SELECT是我需要的 . 但SELECT force启用FetchType.LAZY . 我在某个地方读到这个,似乎就是这样 .

在Devices类中,此配置会产生正确的结果:

@Fetch(value=FetchMode.SELECT)
@OneToMany(fetch=FetchType.EAGER, mappedBy = "device")
public List<DevInterfaces> getDevInterfaces() {
    return this.devInterfaces;
}

但是我不想在我的实体中对FetchType = EAGER进行硬编码 . 我想控制何时进行提取,我想我可以使用fetch()这样做:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Devices> dq = cb.createQuery(Devices.class);
Root<Devices> dev = dq.from(Devices.class);
dev.fetch(Devices_.devInterfaces)

但结果是内部联接,我不希望这样 .

如何在不使用FetchType.EAGER硬编码的情况下使用FetchMode.SELECT进行提取?

1 回答

  • 1

    如上所述,并且还记录了herefetch 使用内连接 .

    使用重载的fetch方法时也可以指定连接类型,该方法也将JoinType作为参数:

    dev.fetch(Devices_.devInterfaces, JoinType.LEFT)
    

相关问题