【问题标题】:QuerySyntaxException: unexpected token:QuerySyntaxException:意外令牌:
【发布时间】:2017-04-17 02:05:24
【问题描述】:

在 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"
            +")")

非法参数异常: 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,因为我的查询要复杂得多

【问题讨论】:

  • 嘿,你的实体是用一对多的关系映射的吗?
  • 一个简单的写法是@Query("Select * from A a left join B b on a.id=b.id")
  • 所以我当然使用关系,我想简化它,这就是我没有包含它的原因。是的,我尝试在 a.id=b.id 上加入,但是对于 JPA,这不起作用,因为 JPA 会自动识别这种关系。并且关键字“on”必须省略
  • 关键字“on”必须省略这是为什么呢?
  • 因为 ON 子句来自映射的连接列并且是自动处理的

标签: java mysql hibernate jpa spring-data


【解决方案1】:

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

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 子句中。

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

【讨论】:

  • 你是对的,你的解决方案更好,但是有没有可能让它按照我的方式工作?
  • @user3871754 很幸运,不。这是在 HQL 文档中。让我更新我的答案
  • 我测试了一下,得到:View的SELECT在FROM子句中包含子查询
  • 等等,Hibernate 告诉你视图不能被调用?
  • 不,我尝试从 phpAdmin 创建视图,我想我必须将 mySQL 更新到 5.7:stackoverflow.com/questions/8428641/…
【解决方案2】:

你可以这样写

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

【讨论】:

  • 谢谢,我通常使用 SELECT a FROM Carparks a LEFT JOIN a.locales 并且它可以工作,但在我的情况下,我想使用嵌套 SELECT 因为我的查询要复杂得多,我要更新问题澄清一下
猜你喜欢
  • 2019-05-07
  • 2021-09-05
  • 2019-06-24
  • 2016-05-30
  • 2019-05-14
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2015-05-21
相关资源
最近更新 更多