在LEFT JOIN hql中进行子选择

时间:2017-10-02 14:09:33

标签: java mysql sql hibernate hql

我有一个查询在我的查询的LEFT JOIN子句中使用子选择 每次运行查询时都会出现org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: (错误。使用'('是我的子选择的左括号。

我的查询看起来像是:

SELECT a, b, c
FROM table1 as t1
INNER JOIN t1.table2 as t2
INNER JOIN t1.table3 as t3
INNER JOIN t3.table4 as t4
LEFT JOIN ( //<- this one gives the error
    SELECT d, e, f
    FROM table9 as t9
    ....
) as xx WITH xx.prop = t2.prop and xx.prop2 = t4.prop
WHERE t1.yy = true and t1.zz = '0'
GROUP BY t2.column

我在sql中有相同的查询,当我在MySQL工作台中运行它时它工作并返回我需要的数据。当我使用HQL版本时,它会在打开子查询的(上出错。

这种子查询在HQL中是否可行,或者我应该使用SQL吗?

如果是的话,我做错了什么?

修改: 我尝试将WITH更改为ON,但仍然会出现同样的错误。

内连接工作正常,因为这是带有Java配置的HQL,它自动匹配外键,因此我不需要在每个连接上使用on / witch子句。

EDIT2

如果我对左边加入进行评论,则查询有效,所以不是缺少on或使用with而不是导致我麻烦的

2 个答案:

答案 0 :(得分:0)

有几处变化:

您的INNER JOIN查询不正确,您需要指定要加入的列表。

FROM table1 as t1
INNER JOIN t1.table2 as t2 // missing ON 

相反,你应该写一些东西

FROM table1 as t1
INNER JOIN t1.table2 as t2 ON t1.col1=t2.col1 

然后,在您的子查询之后,您使用了WITH,这是错误的,您应该使用ON

 ) as xx WITH xx.prop = t2.prop

应该是

) as xx ON xx.prop = t2.prop

此外,在编写

时似乎缺少=
and xx.prop2 t4.prop

答案 1 :(得分:0)

当您加入该表时,您需要使用ON关键字。

   LEFT JOIN ( 
        SELECT d, e, f
        FROM table9 as t9
        ....
    ) as xx ON xx.prop = t2.prop and xx.prop2 = t4.prop

你也忘记了第二个属性的加入中的=

编辑:

  

子查询必须用括号括起来(通常用SQL   聚合函数调用)。甚至相关的子查询(子查询   允许在外部查询中引用别名。注意HQL   子查询只能出现在select或where子句中。

由此,您不能在from子句中使用子查询。