使用 JPQL 连接不相关的实体在休眠 5.3.2 中无法在 Spring 数据中工作

Posted

技术标签:

【中文标题】使用 JPQL 连接不相关的实体在休眠 5.3.2 中无法在 Spring 数据中工作【英文标题】:Joining unrelated Entities using JPQL not working in spring data with hibernate 5.3.2 【发布时间】:2021-10-21 20:31:16 【问题描述】:

我无法弄清楚以下 jpql 查询出了什么问题,我在 Spring Boot 项目中使用了 Spring Data 和 Hibernate 5.3.2。

select t from MdmVehicle t join MdmVehicleGateInOut g with g.vehicleNumber = t.number

以下是我得到的异常:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: in near line 1, column 68 [select t.number from in.ecomexpress.mdm.entities.MdmVehicle t join in.ecomexpress.mdm.entities.MdmVehicleGateInOut g with g.vehicleNumber = t.number]
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)
    at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:296)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:188)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:119)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:597)
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:706)
    ... 172 more

【问题讨论】:

我认为您的包中的in in.ecomexpress.mdm.entities 会导致此错误。您可以尝试将您的包裹更改为没有“in”吗? 我不认为这是问题所在。原因:在我使用外键在表之间建立适当关系的情况下,其他连接工作正常。 此外,在您的加入标准中,您使用 with ?这是有效的吗?不应该是on 吗? 在我自己的演示中尝试使用包in.example,我得到了同样的错误。将其更改为com.example 会使错误消失。它是hibernate验证/创建查询的方式,它附加了完全限定的类名(包括包),并且在“JOIN”关键字之后跟随作为保留文本的“in”,它会中断查询。它全部在您发布的堆栈跟踪中:unexpected token: in near line 1, column 68 [select t.number from in.ecomexpress.mdm.entities.MdmVehicle t join in.ecomexpress.mdm.entities.MdmVehicleGateInOut g with g.vehicleNumber = t.number] 我不知道如何覆盖它,除非将“in”重命名为其他名称。如果您想知道其他联接查询是如何工作的,请将您的记录器 logging.level.org.hibernate=DEBUG 放入 application.properties 并检查包含 QueryTranslatorImplHqlParser 的行,例如在我的日志中:o.h.h.internal.ast.QueryTranslatorImpl : parse() - HQL: SELECT s FROM in.example.demo.Student s JOIN in.example.demo.Course c ON s.courseKey=c.id 【参考方案1】:

这已作为 https://hibernate.atlassian.net/browse/HHH-10953 的一部分进行了修复,并且对此进行了测试,因此我必须假设您使用的是较旧的 Hibernate 版本(即不是您认为正在使用的版本)。

【讨论】:

以上是关于使用 JPQL 连接不相关的实体在休眠 5.3.2 中无法在 Spring 数据中工作的主要内容,如果未能解决你的问题,请参考以下文章

JPQL 基于条件的多对多连接

使用 JPQL 或条件 API 在省略某些字段的同时恢复具有相关实体的实体列表

关联实体和非关联实体之间的连接,导致在 JPQL 中使用 Lazy fetch 生成非持久实体不断抛出 JpqlSyntaxException

JPA JPQL简介

Hibernate JPQL/HQL:聚合函数的错误显示错误的表/实体连接两次(仅使用 HSQLDB)的结果?

使用 JPQL 通过连接表进行查询时出错