QuerySyntaxException:意外标记:

Kam*_*icz 4 java mysql hibernate jpa spring-data

在 MySQL 中它有效:

SELECT * FROM carparks a 
LEFT JOIN  (SELECT * FROM locales_carparks) 
c ON a.carpark_id=c.carpark_id
Run Code Online (Sandbox Code Playgroud)

热翻译成JPA:

@Query("SELECT a FROM Carparks a LEFT JOIN("
            +"SELECT b FROM a.locales b"
            +")")
Run Code Online (Sandbox Code Playgroud)

IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:意外标记:(第 1 行附近,第 72 列 [SELECT a FROM database.model.carpark.Carparks a LEFT JOIN(SELECT b FROM a.locales b)]

我已经简化了示例以显示问题的本质。通常我只使用它SELECT a FROM Carparks a LEFT JOIN a.locales并且它有效,但在我的情况下我想使用嵌套的 SELECT 因为我的查询要复杂得多

Axe*_*elH 5

你可以使用一个简单的替代方案

create view v_carparks as
    SELECT * FROM carparks a 
    LEFT JOIN  (SELECT * FROM locales_carparks) 
    c ON a.carpark_id=c.carpark_id
Run Code Online (Sandbox Code Playgroud)

并将其用于查询

@Query("SELECT a FROM v_carparks")
Run Code Online (Sandbox Code Playgroud)

特别是如果查询很复杂,那么为了隐藏这种复杂性而使用巨大的查询会更清晰。

编辑 :

您不能将嵌套查询用于连接。这在HQL 文档中是这样写的:

请注意,HQL 子查询只能出现在 select 或 where 子句中。

这可以解释为映射系统。很难用子查询结果进行映射。