{"record":{"id":"5c94b6dab3a2bca6","repo":"hibernate/hibernate-orm","slug":"isnotmember-is-not-supported-for-sqmsubquery","errorCode":null,"errorMessage":"isNotMember() is not supported for SqmSubQuery","messagePattern":"isNotMember\\(\\) is not supported for SqmSubQuery","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/query/sqm/tree/spi/select/SqmSubQuery.java","lineNumber":775,"sourceCode":"\t\treturn nodeBuilder().selectCase( this );\n\t}\n\n\t@Nonnull\n\t@Override\n\tpublic <R> SqmCaseSimple<T, R> selectCase(@Nonnull Class<R> resultType) {\n\t\treturn nodeBuilder().selectCase( this, resultType );\n\t}\n\n\t@Nonnull\n\t@Override\n\tpublic SqmPredicate isMember(@Nonnull Expression<? extends Collection<? super T>> collection) {\n\t\tthrow new UnsupportedOperationException( \"isMember() is not supported for SqmSubQuery\" );\n\t}\n\n\t@Nonnull\n\t@Override\n\tpublic JpaPredicate isNotMember(@Nonnull Expression<? extends Collection<? super T>> collection) {\n\t\tthrow new UnsupportedOperationException( \"isNotMember() is not supported for SqmSubQuery\" );\n\t}\n\n\t@Nonnull\n\t@Override\n\tpublic SqmNumericExpression<Long> count() {\n\t\treturn new SqmNumericExpressionWrapper<>( nodeBuilder().count( this ) );\n\t}\n\n\t@Nonnull\n\t@Override\n\tpublic SqmNumericExpression<Long> countDistinct() {\n\t\treturn new SqmNumericExpressionWrapper<>( nodeBuilder().countDistinct( this ) );\n\t}\n\n\t@Override\n\tpublic @Nullable SqmBindableType<T> getNodeType() {\n\t\treturn expressibleType;\n\t}","sourceCodeStart":757,"sourceCodeEnd":793,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/spi/select/SqmSubQuery.java#L757-L793","documentation":"JpaExpression inherits isNotMember(Expression<Collection>) but a subquery is a query node, not an element that can be tested for collection membership, so SqmSubQuery implements it to always throw UnsupportedOperationException. The negated membership predicate must be built with CriteriaBuilder.isNotMember(element, collection), which accepts any expression, including a subquery.","triggerScenarios":"Calling subquery.isNotMember(collectionExpression) — typically from generic predicate factories that uniformly call isNotMember on Expression<T> when T matches the collection element type.","commonSituations":"Specification/filter DSLs that dispatch on expression type; negated membership checks generated reflectively; code migrated from literal- or path-based expressions where the call worked.","solutions":["Create the predicate via the builder: cb.isNotMember(subquery, collectionPath)","In generic code, branch on 'expression instanceof JpaSubQuery' before invoking expression-level membership methods","For 'value NOT IN (subquery)' semantics, use cb.in(...).value(subquery).not() instead"],"exampleFix":"// before\nSubquery<Long> sub = query.subquery(Long.class);\nPredicate p = sub.isNotMember(orderRoot.get(\"tags\")); // UnsupportedOperationException\n\n// after\nPredicate p = cb.isNotMember(sub, orderRoot.get(\"tags\"));","handlingStrategy":"type-guard","validationCode":"if (expr instanceof JpaSubQuery<?>) { p = cb.isNotMember(expr, collection); } else { p = expr.isNotMember(collection); }","typeGuard":"static Predicate notMemberOf(CriteriaBuilder cb, Expression<?> elem, Expression<? extends Collection<?>> coll) { return cb.isNotMember(elem, coll); }","tryCatchPattern":"try { p = expr.isNotMember(coll); } catch (UnsupportedOperationException e) { if (e.getMessage().contains(\"isNotMember\")) p = cb.isNotMember(expr, coll); else throw e; }","preventionTips":["Route all membership predicates through the builder so expression kind never matters","Keep a shared helper for membership/negation instead of calling expression methods inline","Test predicate factories with subquery-valued elements"],"tags":["hibernate","criteria-api","subquery","member-predicate"],"backgroundTag":"ismember-on-subquery","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}