{"record":{"id":"385f89d6a9b5477f","repo":"hibernate/hibernate-orm","slug":"no-parameter-labelled-s-in-query-with-ordinal","errorCode":null,"errorMessage":"No parameter labelled '?%s' in query with ordinal parameters [%s]","messagePattern":"No parameter labelled '\\?(.+?)' in query with ordinal parameters \\[(.+?)\\]","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/query/internal/ParameterMetadataImpl.java","lineNumber":306,"sourceCode":"\t@Override\n\tpublic QueryParameterImplementor<?> findQueryParameter(int positionLabel) {\n\t\treturn queryParametersByPosition == null ? null : queryParametersByPosition.get( positionLabel );\n\t}\n\n\t@Override\n\tpublic QueryParameterImplementor<?> getQueryParameter(int positionLabel) {\n\t\tfinal var queryParameter = findQueryParameter( positionLabel );\n\t\tif ( queryParameter != null ) {\n\t\t\treturn queryParameter;\n\t\t}\n\t\telse {\n\t\t\tfinal String errorMessage = String.format(\n\t\t\t\t\tLocale.ROOT,\n\t\t\t\t\t\"No parameter labelled '?%s' in query with ordinal parameters [%s]\",\n\t\t\t\t\tpositionLabel,\n\t\t\t\t\tStringHelper.join( \", \", getOrdinalParameterLabels() )\n\t\t\t);\n\t\t\tthrow new IllegalArgumentException(\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tnew UnknownParameterException( errorMessage )\n\t\t\t);\n\t\t}\n\t}\n}\n","sourceCodeStart":288,"sourceCodeEnd":313,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/query/internal/ParameterMetadataImpl.java#L288-L313","documentation":"The ordinal twin of the named-parameter lookup: getQueryParameter(int) searches queryParametersByPosition and, when the label is absent, throws IllegalArgumentException (cause UnknownParameterException) listing the ordinal labels the query actually declares. It fires from setParameter(position, ...) or getParameter(position) with a label the query never defined.","triggerScenarios":"Calling setParameter(2, value) on a query that declares only ?1; binding to a label that was removed when the query was edited; using ordinal binding on a query that only has named parameters.","commonSituations":"Editing a query and dropping a predicate without renumbering or updating bind calls; copy-pasted binding blocks between queries with different parameter counts; mixing ?1-style binding with queries that use :name.","solutions":["Align the bind position with the labels listed in the message (query.getParameterMetadata().getOrdinalParameterLabels()).","Renumber the HQL labels and the setParameter calls together so they stay 1..N.","Prefer named parameters to avoid position/index coupling entirely."],"exampleFix":"// before\nvar q = session.createQuery(\"from Person p where p.age > ?1\", Person.class);\nq.setParameter(2, 30); // throws: only '?1' exists\n\n// after\nq.setParameter(1, 30);","handlingStrategy":"validation","validationCode":"static void requireOrdinalParam(org.hibernate.query.Query<?> q, int position) {\n    if (!q.getParameterMetadata().getOrdinalParameterLabels().contains(position))\n        throw new IllegalArgumentException(\"Query declares no parameter ?\" + position\n            + \" - declared: \" + q.getParameterMetadata().getOrdinalParameterLabels());\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep ordinal labels 1..N and bind them from one loop over a value array.","Update all setParameter call sites whenever a predicate is added or removed.","Prefer named parameters to break the positional coupling."],"tags":["hibernate","hql","positional-parameters","parameter-binding"],"backgroundTag":"unknown-query-parameter","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}