Java QuerySyntaxException:意外标记:
在MySQL中,它可以工作:Java QuerySyntaxException:意外标记:,java,mysql,hibernate,jpa,spring-data,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" +")") IllegalArgumentExc
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列附近[从
database.model.carpark.Carparks a左接缝选择b
来自a.locales b]
我简化了这个例子来说明问题的本质。通常我使用justSELECT a FROM Carparks a LEFT JOIN a.locales,但在我的例子中,我想使用嵌套选择,因为我的查询要复杂得多您可以这样编写它
@Query("SELECT a FROM Carparks a LEFT JOIN Locales b on a.carpark_id = b.carpark_id")
你可以使用一个简单的替代方案
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子查询只能出现在select或where子句中
这可以解释为映射系统。很难使用子查询结果进行映射。嘿,您的实体是否映射为一对多之类的关系?一种简单的编写方法是@QuerySelect*从a左a左a连接B在a.id=B.ids上。当然,我使用关系,我想简化它,这就是我没有包含它的原因。是的,我试着在a.id=b.id上加入,但对于JPA,这不起作用,因为JPA会自动识别这种关系。关键字onmust被省略关键字onmust被省略为什么?因为ON子句来自映射的join列,并且是由anks自动处理的,所以我通常使用SELECT a from Carparks a LEFT join a.locales,它可以工作,但是在我的例子中,我想使用嵌套SELECT,因为我的查询要复杂得多,我将更新问题以澄清它。你是对的,你的解决方案更好,但是否有可能以某种方式让它按照我的方式工作?@user3871754,没有。这在HQL文档中。让我更新我的答案我测试了它,得到了:视图的SELECT在FROM子句中包含一个子查询wait,Hibernate告诉你该视图无法调用?不,我尝试从phpAdmin创建视图我想我必须将mySQL更新到5.7: