QuerySyntaxException:意外令牌:

时间:2016-12-02 08:13:20

标签: 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

很高兴将其翻译为JPA:

@Query("SELECT a FROM Carparks a LEFT JOIN("
            +"SELECT b FROM a.locales b"
            +")")
  

抛出:IllegalArgumentException:   org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:   (第1栏第72栏附近[SELECT a FROM   database.model.carpark.Carparks LEFT JOIN(SELECT b   来自a.locales b)]

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

2 个答案:

答案 0 :(得分:4)

您可以使用简单的替代方案

create view v_carparks as
    SELECT * FROM carparks a 
    LEFT JOIN  (SELECT * FROM locales_carparks) 
    c ON a.carpark_id=c.carpark_id

并将其用于查询

@Query("SELECT a FROM v_carparks")

特别是如果查询很复杂,那么在视图中使用大量查询来隐藏这种复杂性会更加清晰。

编辑:

您无法使用嵌套查询进行连接。这是用HQL documentation这样写的:

  

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

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

答案 1 :(得分:0)

你可以像这样写

@Query("SELECT a FROM Carparks a LEFT JOIN Locales b on a.carpark_id = b.carpark_id")