| Trying to use a negated predicate at a custom join @ the "ON" method, generates a ClassCastException As an example, Having Stores and Books,
final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
final CriteriaQuery<Book> q = cb.createQuery(Book.class);
final Root<Book> bookRoot = q.from(Book.clasStore
SetJoin<Book, Store> storeJoin = bookRoot.join(Book_.stores);
storeJoin.on(cb.isNotNull(storeJoin.get(Store_.address)));
That query would Crash with
java.lang.ClassCastException: org.hibernate.query.criteria.internal.predicate.NegatedPredicateWrapper cannot be cast to org.hibernate.query.criteria.internal.predicate.AbstractPredicateImpl
at org.hibernate.query.criteria.internal.path.AbstractJoinImpl.renderTableExpression(AbstractJoinImpl.java:85)
at org.hibernate.query.criteria.internal.QueryStructure.renderJoins(QueryStructure.java:349)
at org.hibernate.query.criteria.internal.QueryStructure.renderJoins(QueryStructure.java:350)
at org.hibernate.query.criteria.internal.QueryStructure.renderFromClause(QueryStructure.java:303)
at org.hibernate.query.criteria.internal.QueryStructure.render(QueryStructure.java:244)
at org.hibernate.query.criteria.internal.CriteriaQueryImpl.interpret(CriteriaQueryImpl.java:292)
at org.hibernate.query.criteria.internal.compile.CriteriaCompiler.compile(CriteriaCompiler.java:127)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:3611)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:203)
On AbstractJoinImpl.java:86 there's a Cast to AbstractPredicateImpl, but NegatedPredicateWrapper is not an child of AbstractPredicateImpl, thus failing the cast. This affects any predicate that depends on a "not" clausule. |