【问题标题】:JPQL left outer join does unnecessary joinsJPQL 左外连接执行不必要的连接
【发布时间】:2014-08-08 11:47:42
【问题描述】:

我有以下 JPQL:

SELECT a.b.id, a.b.name, a.c.id,a.c.name 
 left join a.b left join a.c
 group by a.b.id,a.b.name,a.c.id,a.c.name

现在 b 和 c 都引用同一个表。 生成的 SQL 正在执行我要求的左连接,以及 a.b.name 和 a.c.name 的另一个连接 (这是不必要的,因为左连接包含名称,并且它检索的结果比预期的要多) 如何使生成的 SQL 不包含不必要的连接?

提出的1个解决方案不是选择名称并通过不同的查询单独检索它们..但这不是我想的最优雅的方式..

(顺便说一句,我尝试选择 a.b,a.c 并按 a.b,a.c 分组,但它抛出 ORA 不是按表达式分组,因为生成的 sql 检索所有行,但分组依据仅按 ID) 并且左连接是必要的,因为我想允许空值。

非常感谢。

【问题讨论】:

    标签: jpa left-join jpql


    【解决方案1】:
    SELECT a.b.id, a.b.name, a.c.id,a.c.name 
    

    上面隐式地在 a abd b 和 a 和 c 之间创建了另一个内连接。查询应该是

    select b.id, b.name, c.id, c.name
    from A a
    left join a.b b
    left join a.c c
    

    group by 子句没有任何意义,因为您的 select 子句中没有聚合。例如,group by 会很有用

    select b.id, b.name, c.id, c.name, count(c.foo)
    from A a
    left join a.b b
    left join a.c c
    group by b.id, b.name, c.id, c.name
    

    【讨论】:

    • 是的,我有一个计数(a),我没有提到它,因为它与我的问题没有任何关系。无论如何,它似乎真的很有帮助,非常感谢。
    猜你喜欢
    • 2015-03-04
    • 2014-11-22
    • 2015-07-18
    • 1970-01-01
    • 2011-10-01
    • 2012-01-08
    • 2012-10-25
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多