【问题标题】:@JoinFetch not doing anything (EclipseLink)@JoinFetch 什么都不做(EclipseLink)
【发布时间】:2011-12-20 12:00:00
【问题描述】:

我有一个实体 Base,与嵌套的实体具有多对一的关系。我想通过 Nested.name 订购查询,其中 name 可以为空。即使名称为空,我也希望查询返回这一行。所以我试图让 EclipseLink 生成将这些 LEFT JOIN 连接在一起的查询,而不是从两个表中进行选择。

我已经用@JoinFetch注解对Base和Nested的关系做了如下注解:

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "BASE_ID")
@JoinFetch(value = JoinFetchType.OUTER)
private Nested nested;

但是,这似乎根本不会以任何方式影响 EclipseLink 生成的查询。实际生成的查询是

SELECT ... FROM BASE t0, NESTED t1 WHERE (t1.ID = t0.BASE_ID) ORDER BY t1.NAME ASC...

虽然我期待一些类似的东西

SELECT ... FROM BASE t0 LEFT JOIN NESTED t1 ON (t1.ID = t0.BASE_ID) ORDER BY t1.NAME ASC...

我正在使用 JPA 2.0 Criteria API 来构建和执行查询。即使我使用条件 API 显式构建连接查询,生成的查询也会看起来像第一个,没有连接。在构建查询时显式加入似乎适用于 Hibernate,但对 EclipseLink 中的结果查询没有影响。

我可能在这里遗漏了一些基本的东西,所以欢迎任何提示。

谢谢

【问题讨论】:

    标签: java jpa left-join eclipselink


    【解决方案1】:

    我认为问题出在您的 orderBy 中(它没有使用外连接,因此使 fetch 的外连接无效)。

    您是如何设置订单的?您是否使用了外部联接?

    【讨论】:

    • 基本上代码的作用是Join<Object, Object> join = queryRoot.join("nested", JoinType.LEFT); query.orderBy(criteriaBuilder.asc(join.get("name")));
    • 问题是我先做了queryRoot.get("nested")然后queryRoot.join...,这显然导致第一个“get”将连接指定为内部连接。感谢您为我指明正确的方向!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 2019-03-08
    • 2016-12-24
    • 2017-04-18
    • 2011-08-03
    • 2014-05-11
    • 2014-09-10
    相关资源
    最近更新 更多