Предикаты гибернации - неверный путь - PullRequest
0 голосов
/ 28 мая 2018

Давайте иметь три объекта: Event, MessageEvent и Message.MessageEvent является подклассом Event (с правильно установленным DiscriminatorValue).MessageEvent имеет одно дополнительное свойство «message», которое имеет тип Message.Он определяется следующим образом:

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

Теперь мы пытаемся установить предикат, который найдет все MessageEvent, чей идентификатор сообщения равен 2. Мы делаем это следующим образом:

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. Тот же запрос корректно обрабатывается при использовании ссылки затмения ORM.

1 Ответ

0 голосов
/ 29 мая 2018

Проблема лежит под капотом Hibernate.Я даже обнаружил ошибку в их системе отслеживания ошибок и обнаружил, что она уже исправлена ​​- https://hibernate.atlassian.net/browse/HHH-10561.Wildfly 12, однако, использует 5.1.x.После обновления Hibernate до 5.2.17 проблема исчезла.

...