{"record":{"id":"fb2210f24b5b7bd1","repo":"hibernate/hibernate-orm","slug":"named-parameter-name-is-not-registered-w","errorCode":null,"errorMessage":"Named parameter [\" + name + \"] is not registered with this procedure call","messagePattern":"Named parameter \\[\" \\+ name \\+ \"\\] is not registered with this procedure call","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParameterMetadataImpl.java","lineNumber":155,"sourceCode":"\t@Override\n\tpublic ProcedureParameterImplementor<?> findQueryParameter(String name) {\n\t\tif ( parameters != null ) {\n\t\t\tfor ( var parameter : parameters ) {\n\t\t\t\tif ( name.equals( parameter.getName() ) ) {\n\t\t\t\t\treturn parameter;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic ProcedureParameterImplementor<?> getQueryParameter(String name) {\n\t\tfinal var parameter = findQueryParameter( name );\n\t\tif ( parameter != null ) {\n\t\t\treturn parameter;\n\t\t}\n\t\tthrow new IllegalArgumentException( \"Named parameter [\" + name + \"] is not registered with this procedure call\" );\n\t}\n\n\t@Override\n\tpublic ProcedureParameterImplementor<?> findQueryParameter(int positionLabel) {\n\t\tif ( parameters != null ) {\n\t\t\tfor ( var parameter : parameters ) {\n\t\t\t\tif ( parameter.getName() == null\n\t\t\t\t\t\t&& positionLabel == parameter.getPosition() ) {\n\t\t\t\t\treturn parameter;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic ProcedureParameterImplementor<?> getQueryParameter(int positionLabel) {\n\t\tfinal var queryParameter = findQueryParameter( positionLabel );","sourceCodeStart":137,"sourceCodeEnd":173,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParameterMetadataImpl.java#L137-L173","documentation":"getQueryParameter(String) scans the registered parameters and throws IllegalArgumentException when none carries that name. Hibernate's native ProcedureCall requires every parameter to be explicitly registered before binding — unlike HQL, where parameters are discovered from the query text. The message includes the exact name that failed to resolve.","triggerScenarios":"call.getParameterBindings().getBinding(\"total\") or StoredProcedureQuery.setParameter(\"total\", value) when \"total\" was never registered, or was registered positionally so only getPosition() is set.","commonSituations":"Assuming HQL-style auto-discovered parameters also work for stored procedures; a typo in the parameter name (case-sensitive); switching a call from named to positional registration while keeping setParameter(name, ...) calls; optional parameters that are set conditionally but never registered.","solutions":["Register the parameter before binding: call.registerParameter(\"total\", BigDecimal.class, ParameterMode.OUT)","Use the find-style lookup (findQueryParameter) or inspect registered parameters before binding instead of the throwing get variant","Make the bound name match the registration exactly, including case"],"exampleFix":"// before\nStoredProcedureQuery q = em.createStoredProcedureQuery(\"checkout\");\nq.setParameter(\"total\", new BigDecimal(10)); // not registered\n\n// after\nq.registerStoredProcedureParameter(\"total\", BigDecimal.class, ParameterMode.INOUT);\nq.setParameter(\"total\", new BigDecimal(10));","handlingStrategy":"validation","validationCode":"// Register before binding (Jakarta API)\nStoredProcedureQuery q = em.createStoredProcedureQuery(\"checkout\");\nq.registerStoredProcedureParameter(\"total\", BigDecimal.class, ParameterMode.INOUT);\nq.setParameter(\"total\", total);","typeGuard":null,"tryCatchPattern":"try {\n    call.getParameterBindings().getBinding(\"total\");\n} catch (IllegalArgumentException e) {\n    // \"total\" was never registered: register it, or fix the typo in the name\n}","preventionTips":["Register every parameter before any setParameter call","Treat setParameter on a stored procedure as valid only after registerStoredProcedureParameter","Share parameter-name constants between registration and binding code","Do not assume HQL-style parameter auto-discovery applies to procedures"],"tags":["hibernate","stored-procedure","parameter-binding"],"backgroundTag":"unregistered-procedure-parameter","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}