{"record":{"id":"923c170783afea2e","repo":"hibernate/hibernate-orm","slug":"no-argument-for-named-parameter","errorCode":null,"errorMessage":"No argument for named parameter ':{}'","messagePattern":"No argument for named parameter ':(.+?)'","errorType":"exception","errorClass":"QueryParameterException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingsImpl.java","lineNumber":172,"sourceCode":"\t}\n\n\t@Override\n\tpublic QueryParameterBinding<?> getBinding(String name) {\n\t\tfinal var binding = parameterBindingMapByNameOrPosition.get( name );\n\t\tif ( binding == null ) {\n\t\t\t// Invoke this method to throw the exception\n\t\t\tparameterMetadata.getQueryParameter( name );\n\t\t}\n\t\treturn binding;\n\t}\n\n\t@Override\n\tpublic void validate() {\n\t\tfor ( var entry : parameterBindingMap.entrySet() ) {\n\t\t\tif ( !entry.getValue().isBound() ) {\n\t\t\t\tfinal var queryParameter = entry.getKey();\n\t\t\t\tif ( queryParameter.isNamed() ) {\n\t\t\t\t\tthrow new QueryParameterException(\n\t\t\t\t\t\t\t\"No argument for named parameter ':\"\n\t\t\t\t\t\t\t\t+ queryParameter.getName() + \"'\" );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow new QueryParameterException(\n\t\t\t\t\t\t\t\"No argument for ordinal parameter '?\"\n\t\t\t\t\t\t\t\t+ queryParameter.getPosition() + \"'\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean hasAnyMultiValuedBindings() {\n\t\tfor ( var binding : parameterBindingMap.values() ) {\n\t\t\tif ( binding.isMultiValued() ) {\n\t\t\t\treturn true;\n\t\t\t}","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingsImpl.java#L154-L190","documentation":"Before a query executes, QueryParameterBindingsImpl.validate() walks every declared parameter and throws QueryParameterException naming the first unbound one. Hibernate does not substitute null or ignore missing named arguments, so every :name in the HQL must receive a setParameter call before list()/getResultList()/executeUpdate().","triggerScenarios":"createQuery(\"... where p.status = :status\") executed without any setParameter(\"status\", ...); a dynamic filter builder that appends the predicate but skips the binding on some branch, or binds after a conditional early return.","commonSituations":"Optional search filters where one code path forgets the bind; refactors that rename a parameter only in the HQL; new parameters added to a shared query string without updating all call sites.","solutions":["Set every declared parameter before execution; the message names the missing one.","Build the predicate and its binding in the same conditional block so they cannot diverge.","For genuinely optional filters, omit the whole predicate when the value is absent (dynamic query building or Criteria with optional predicates)."],"exampleFix":"// before\nvar q = session.createQuery(\"from Person p where p.status = :status\", Person.class);\n// setParameter forgotten\nq.list(); // throws: No argument for named parameter ':status'\n\n// after\nq.setParameter(\"status\", status != null ? status : Status.ACTIVE);\n// or: append \"and p.status = :status\" to the HQL only when you also bind it","handlingStrategy":"validation","validationCode":"static void assertAllBound(org.hibernate.query.Query<?> q, java.util.Set<String> boundNames) {\n    for (String name : q.getParameterMetadata().getNamedParameterNames()) {\n        if (!boundNames.contains(name))\n            throw new IllegalArgumentException(\"Unbound parameter :\" + name);\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    return q.list();\n} catch (org.hibernate.QueryParameterException e) {\n    // message names the missing ':name'; log and surface as a 400\n}","preventionTips":["Append predicate and binding together in dynamic builders.","Execute each repository method once in tests to flush missing bindings.","Treat optional filters by omitting the predicate, not by skipping the bind."],"tags":["hibernate","hql","named-parameters","unbound-parameter","validation"],"backgroundTag":"missing-query-parameter","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}