Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠谓词-无效路径_Java_Hibernate_Jpa_Jakarta Ee_Criteria Api - Fatal编程技术网

Java 休眠谓词-无效路径

Java 休眠谓词-无效路径,java,hibernate,jpa,jakarta-ee,criteria-api,Java,Hibernate,Jpa,Jakarta Ee,Criteria Api,让我们有三个实体:Event、MessageEvent和Message。MessageEvent是Event的子类(具有正确设置的DiscriminatorValue)。MessageEvent还有一个属性“message”,它的类型为message。其定义如下: @ManyToOne(optional = false, cascade = CascadeType.REMOVE) @JoinColumn(name = "MESAGE_ID", nullable = false) private

让我们有三个实体: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本身还是我们做错了什么

最低限度的演示可在


在Java8、Java10(openjdk)、Wildfly 10和Wildfly 12上测试。在使用eclipse链接ORM时,同样的查询也得到了正确处理。

问题在于Hibernate的保护之下。我甚至在他们的bug跟踪系统中发现了这个bug,并且发现它已经被修复了。然而,Wildfly 12使用5.1.x。将Hibernate升级到5.2.17后,问题消失了。

我们在Hibernate中也遇到了类似的问题。似乎即使指定了子类,Hibernate也将联接别名视为
Event
,而不是
MessageEvent