{"record":{"id":"5f8e96430f32b338","repo":"hibernate/hibernate-orm","slug":"path-is-not-a-plural-path-pluralattributepath-ge","errorCode":null,"errorMessage":"Path is not a plural path '{pluralAttributePath.getNavigablePath()}'","messagePattern":"Path is not a plural path '(.+?)'","errorType":"exception","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java","lineNumber":5279,"sourceCode":"\t\t\treturn new SqmAny<>(\n\t\t\t\t\tcreateCollectionReferenceSubQuery(\n\t\t\t\t\t\t\tctx.simplePath(),\n\t\t\t\t\t\t\t(TerminalNode) ctx.collectionQuantifier().getChild(0).getChild(0)\n\t\t\t\t\t),\n\t\t\t\t\tnodeBuilder()\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate <X> SqmSubQuery<X> createCollectionReferenceSubQuery(\n\t\t\tHqlParser.SimplePathContext pathCtx,\n\t\t\tTerminalNode collectionReferenceCtx) {\n\t\tfinal var pluralAttributePath = consumeDomainPath( pathCtx );\n\t\tfinal var referencedPathSource = pluralAttributePath.getReferencedPathSource();\n\n\t\tif ( !(referencedPathSource instanceof PluralPersistentAttribute ) ) {\n\t\t\t//TODO: improve this message\n\t\t\tthrow new SemanticException( \"Path is not a plural path '\" + pluralAttributePath.getNavigablePath() + \"'\",\n\t\t\t\t\tquery );\n\t\t}\n\t\tfinal SqmSubQuery<X> subQuery = new SqmSubQuery<>(\n\t\t\t\tprocessingStateStack.getCurrent().getProcessingQuery(),\n\t\t\t\tnodeBuilder()\n\t\t);\n\t\tfinal var selectClause = new SqmSelectClause( false, 1, nodeBuilder() );\n\t\tfinal var fromClause = new SqmFromClause( 1 );\n\t\tSqmPath<?> lhs = pluralAttributePath.getLhs();\n\t\tfinal List<String> implicitJoinPaths = new ArrayList<>();\n\t\twhile ( !(lhs instanceof AbstractSqmFrom<?, ?> correlationBase) ) {\n\t\t\timplicitJoinPaths.add( lhs.getNavigablePath().getLocalName() );\n\t\t\tlhs = lhs.getLhs();\n\t\t}\n\t\tfinal var correlation = correlationBase.createCorrelation();\n\t\tSqmFrom<?, ?> joinBase = correlation;\n\t\tfor ( int i = implicitJoinPaths.size() - 1; i >= 0; i-- ) {\n\t\t\tjoinBase = joinBase.join( implicitJoinPaths.get( i ) );","sourceCodeStart":5261,"sourceCodeEnd":5297,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java#L5261-L5297","documentation":"Error \"Path is not a plural path '{pluralAttributePath.getNavigablePath()}'\" thrown in hibernate/hibernate-orm.","triggerScenarios":"A collection-typed path is required but not found: Path is not a plural path '<value>'","commonSituations":"Applying collection operations (elements/indices/key/value/index, slice, member of) to singular paths, or to joined lists/maps that are not compound/indexed paths.","solutions":["The function expects a plural (collection-valued) path, but the given path resolves to a singular attribute. Pass a collection-valued association path."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}