JPQL左外连接执行不必要的连接

时间:2014-06-18 08:54:22

标签: jpa left-join jpql

我有以下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和group但是它会抛出ORA而不是按表达式分组,因为生成的sql检索所有行但是group by只能通过ID) 并且左连接是必要的,因为我想允许空值。

非常感谢。

1 个答案:

答案 0 :(得分:0)

SELECT a.b.id, a.b.name, a.c.id,a.c.name 

上面隐含地创建了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