简体   繁体   English

休眠谓词-无效路径

[英]Hibernate predicates - Invalid path

Let's have three entities: Event, MessageEvent and Message. 让我们拥有三个实体:Event,MessageEvent和Message。 MessageEvent is a subclass of Event (with correctly set DiscriminatorValue). MessageEvent是Event的子类(正确设置了DiscriminatorValue)。 MessageEvent has one additional property "message", which is of type Message. MessageEvent具有一个附加属性“ message”,其类型为Message。 It is defined as below: 定义如下:

@ManyToOne(optional = false, cascade = CascadeType.REMOVE)
@JoinColumn(name = "MESAGE_ID", nullable = false)
private Message message;

Now, we're trying to set a predicate that will find all MessageEvent-s whose message's id is 2. We do it in the following way: 现在,我们试图设置一个谓词,以查找所有消息id为2的MessageEvent-s。我们通过以下方式进行操作:

cb.equal(cb.treat(root, MessageEvent.class).join(MessageEvent_.message, JoinType.LEFT).get(Message_.id), 2)

The code compiles well, however, we get this error at runtime: 代码编译良好,但是,我们在运行时遇到此错误:

5:40:59,891 ERROR [org.hibernate.hql.internal.ast.ErrorCounter] (default task-2)  Invalid path: 'generatedAlias1.id':  Invalid path: 'generatedAlias1.id'
at org.hibernate//org.hibernate.hql.internal.ast.util.LiteralProcessor.lookupConstant(LiteralProcessor.java:114)
at org.hibernate//org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:214)
at org.hibernate//org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:109)
at org.hibernate//org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:104)
at org.hibernate//org.hibernate.hql.internal.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:1033)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1286)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4699)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:4169)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2134)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2084)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2084)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2084)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2084)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2059)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2059)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:813)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:607)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:311)
at org.hibernate//org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:259)

Hibernate is apparently having a problem with the construction of the corresponding SQL query. Hibernate显然在构造相应的SQL查询时遇到问题。 Is the problem located in Hibernate itself or did we do anything wrong? 问题出在Hibernate本身还是我们做错了?

A minimal demo is available at https://github.com/JurajMlich/hibernate-bug-demonstration . https://github.com/JurajMlich/hibernate-bug-demonstration上有一个最小的演示。

Tested on Java 8, Java 10 (openjdk), Wildfly 10, Wildfly 12. The same query is correctly handled when using eclipse link ORM. 在Java 8,Java 10(openjdk),Wildfly 10,Wildfly 12上进行了测试。使用eclipse链接ORM可以正确处理相同的查询。

The problem lies under the hood of Hibernate. 问题在于休眠状态。 I even discovered the bug in their bug tracking system and found out that it has already been fixed - https://hibernate.atlassian.net/browse/HHH-10561 . 我什至在他们的错误跟踪系统中发现了该错误,并发现该错误已得到修复-https: //hibernate.atlassian.net/browse/HHH-10561 Wildfly 12, however, uses 5.1.x . 但是,Wildfly 12使用5.1.x。 After upgrading Hibernate to 5.2.17, the problem disappeared. 将Hibernate升级到5.2.17之后,问题消失了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM