【问题标题】:EclipseLink:How to avoid additional sql query for nested left joinEclipseLink:如何避免嵌套左连接的额外 sql 查询
【发布时间】:2016-10-02 10:34:17
【问题描述】:

我有以下实体:

@Entity
class A{
 @OneToMany
 private List<B> bs;
 ...
}

@Entity
class B{
 @OneToMany
 private List<C> cs;
 ...
}

@Entity
class C{
 ...
}

所以我做了以下查询:

SELECT a FROM A a LEFT JOIN FETCH a.bs b LEFT JOIN b.cs

此代码有效,唯一的问题是在一个连接查询中从数据库中读取 A 和 B,但是对于读取 C (LEFT JOIN b.cs),执行单独的 sql 查询以仅读取 C 实体。如何在一个 sql 查询中读取 A、B、C。

【问题讨论】:

    标签: java jpa eclipselink


    【解决方案1】:

    JPA 不允许嵌套 fetch 连接,但您可以使用 EclipseLink 特定的left-join-fetch query hint 告诉它您想要获取 b.cs 关系。见this answer

    编辑:

    使用代码

    Query query = em.createQuery("SELECT a FROM A a");
    query.setHint("eclipselink.join-fetch", "a.bs.cs");
    

    在同一个查询中获取并加入 a->bs 和 bs->cs。

    【讨论】:

    • 说实话我听不懂你的意思。我知道你写的。顺便说一下,我使用了 eclipse 链接的 left-joint-fetch。问题是关于使用它不是吗?
    • 点击链接。 JPA 不支持“A a LEFT JOIN FETCH a.bs b LEFT JOIN FETCH b.cs”,这是在同一个查询中获取所有 3 个实体所需要的。我向您指出了允许您在 b.cs 关系上指定 fetch join 的查询提示。这与我也链接到的问题/答案略有不同
    • 谢谢你的解释。我做了什么:1)我将&lt;property name="eclipselink.left-join-fetch" value="true"/&gt;添加到persistence.xml 2)我将query.setHint("eclipselink.LEFT_FETCH", "a.bs.cs");添加到代码3)我更正了查询:SELECT a FROM A a LEFT JOIN FETCH a.bs LEFT JOIN a.bs.cs。结果是异常:The collection-valued path 'a.bs.cs' cannot be resolved to a valid association field。我的错误是什么?
    • 我又做了 #1 和 #2。 #3 现在是:SELECT a FROM A a LEFT JOIN FETCH a.bs。结果与我的问题相同 - 两个查询。
    • 问题已通过 query.setHint("eclipselink.join-fetch", "a.bs.cs"); 解决
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2011-01-09
    • 1970-01-01
    相关资源
    最近更新 更多