{"record":{"id":"6bfa013621b7f062","repo":"hibernate/hibernate-orm","slug":"ismember-is-not-supported-for-sqmsubquery","errorCode":null,"errorMessage":"isMember() is not supported for SqmSubQuery","messagePattern":"isMember\\(\\) 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":769,"sourceCode":"\tpublic SqmCriteriaNodeBuilder nodeBuilder() {\n\t\treturn (SqmCriteriaNodeBuilder) super.nodeBuilder();\n\t}\n\n\t@Override\n\tpublic <R> SqmCaseSimple<T, R> selectCase() {\n\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 ) );","sourceCodeStart":751,"sourceCodeEnd":787,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/spi/select/SqmSubQuery.java#L751-L787","documentation":"JpaExpression inherits isMember(Expression<Collection>) from the expression API, but a subquery is not a value that can be a member of a collection — it is a query node. SqmSubQuery therefore implements isMember to always throw UnsupportedOperationException. Membership predicates must be created through the CriteriaBuilder (cb.isMember(element, collection)) so that Hibernate can build the correct SQL.","triggerScenarios":"Calling subquery.isMember(collectionExpression) — usually from generic predicate factories that call isMember on any Expression<T> when T matches the collection element type, or from copy-adapted code that treats all expressions uniformly.","commonSituations":"Generic filter/specification builders (Spring Data JPA-like Specs) that dispatch on expression types; code ported from places where the expression was a literal or path; metaprogrammed predicate generation.","solutions":["Create the predicate via the builder: cb.isMember(subquery, collectionPath) — the two-arg CriteriaBuilder method accepts any expression including subqueries","In generic code, check 'expression instanceof JpaSubQuery' (or SqmSubQuery) before calling instance methods and route subqueries to builder methods","If you meant 'value IN (subquery)', use cb.in(...) / subquery-in predicates instead of isMember"],"exampleFix":"// before\nSubquery<Long> sub = query.subquery(Long.class);\nPredicate p = sub.isMember(orderRoot.get(\"tags\")); // UnsupportedOperationException\n\n// after\nPredicate p = cb.isMember(sub, orderRoot.get(\"tags\")); // builder-created predicate","handlingStrategy":"type-guard","validationCode":"if (expr instanceof JpaSubQuery<?>) { p = cb.isMember(expr, collection); } else { p = expr.isMember(collection); }","typeGuard":"static Predicate memberOf(CriteriaBuilder cb, Expression<?> elem, Expression<? extends Collection<?>> coll) { return cb.isMember(elem, coll); } // safe for any expression kind","tryCatchPattern":"try { p = expr.isMember(coll); } catch (UnsupportedOperationException e) { if (e.getMessage().contains(\"isMember\")) p = cb.isMember(expr, coll); else throw e; }","preventionTips":["Create membership predicates through CriteriaBuilder.isMember/isNotMember, never through the element expression","In generic predicate factories, special-case JpaSubQuery expressions","Add a subquery element to unit tests of expression-dispatching code"],"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"}