java - 查询语法异常 : unexpected token:

标签 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: unexpected token: ( near line 1, column 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 因为我的查询要复杂得多

最佳答案

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

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

特别是如果查询很复杂,在 View 中使用一个巨大的查询来隐藏这种复杂性会更干净。

编辑:

您不能使用嵌套查询进行连接。这是写在HQL documentation像这样:

Note that HQL subqueries can occur only in the select or where clauses.

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

关于java - 查询语法异常 : unexpected token:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40927513/

相关文章:

java - Hibernate 每个国家/地区一个实体多个表

php - 使用 ZEROFILL 精确比较两个数字

java - 在 Hibernate 映射中 : how to set default value?

Spring | hibernate |使用 AspectJ 进行事务管理

java - @Transactional测试中未填充联接表

java - 无明显原因的空指针异常

java - 如何使用 Jackson ObjectMapper 将 json 读入仅知道实体类的集合

php - 为什么我的 MySQL 查询这么慢?

尝试更改用户模式权限时,MySQL 导致蓝屏(意外的内核模式陷阱)

java - 与数据库相比,Hibernate native SQL 未返回正确的结果