使用 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
并检查包含 QueryTranslatorImpl
和 HqlParser
的行,例如在我的日志中: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 或条件 API 在省略某些字段的同时恢复具有相关实体的实体列表
关联实体和非关联实体之间的连接,导致在 JPQL 中使用 Lazy fetch 生成非持久实体不断抛出 JpqlSyntaxException