Hibernate 谓词 - 无效路径
Hibernate predicates - Invalid path
让我们拥有三个实体:Event、MessageEvent 和 Message。 MessageEvent 是 Event 的子类(正确设置了 DiscriminatorValue)。 MessageEvent 有一个额外的 属性 "message",它是 Message 类型。定义如下:
@ManyToOne(optional = false, cascade = CascadeType.REMOVE)
@JoinColumn(name = "MESAGE_ID", nullable = false)
private Message message;
现在,我们正在尝试设置一个谓词来查找所有消息 ID 为 2 的 MessageEvent-s。我们按以下方式进行:
cb.equal(cb.treat(root, MessageEvent.class).join(MessageEvent_.message, JoinType.LEFT).get(Message_.id), 2)
代码编译良好,但是,我们在运行时遇到此错误:
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 显然在构建相应的 SQL 查询时遇到了问题。问题出在 Hibernate 本身还是我们做错了什么?
https://github.com/JurajMlich/hibernate-bug-demonstration 提供了一个最小演示。
在 Java 8、Java 10 (openjdk)、Wildfly 10、Wildfly 12 上测试。使用 eclipse link ORM 时可以正确处理相同的查询。
问题出在 Hibernate 的底层。我什至在他们的错误跟踪系统中发现了这个错误,并发现它已经被修复 - https://hibernate.atlassian.net/browse/HHH-10561 。然而,Wildfly 12 使用 5.1.x 。升级Hibernate到5.2.17后问题消失
让我们拥有三个实体:Event、MessageEvent 和 Message。 MessageEvent 是 Event 的子类(正确设置了 DiscriminatorValue)。 MessageEvent 有一个额外的 属性 "message",它是 Message 类型。定义如下:
@ManyToOne(optional = false, cascade = CascadeType.REMOVE)
@JoinColumn(name = "MESAGE_ID", nullable = false)
private Message message;
现在,我们正在尝试设置一个谓词来查找所有消息 ID 为 2 的 MessageEvent-s。我们按以下方式进行:
cb.equal(cb.treat(root, MessageEvent.class).join(MessageEvent_.message, JoinType.LEFT).get(Message_.id), 2)
代码编译良好,但是,我们在运行时遇到此错误:
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 显然在构建相应的 SQL 查询时遇到了问题。问题出在 Hibernate 本身还是我们做错了什么?
https://github.com/JurajMlich/hibernate-bug-demonstration 提供了一个最小演示。
在 Java 8、Java 10 (openjdk)、Wildfly 10、Wildfly 12 上测试。使用 eclipse link ORM 时可以正确处理相同的查询。
问题出在 Hibernate 的底层。我什至在他们的错误跟踪系统中发现了这个错误,并发现它已经被修复 - https://hibernate.atlassian.net/browse/HHH-10561 。然而,Wildfly 12 使用 5.1.x 。升级Hibernate到5.2.17后问题消失