hibernate/hibernate-orm · error · IllegalStateException
The parameter named '{name}' has no argument
Error message
The parameter named '{name}' has no argument What it means
Thrown (IllegalStateException) by getParameterValue(String name) when the named parameter exists but its binding is not bound: getQueryParameterBindings().getBinding(name) returns the binding object and !binding.isBound() is true. It is the read-before-write guard for named parameters; a completely unknown parameter name fails earlier inside getBinding(name) with a HibernateException instead.
Source
Thrown at hibernate-core/src/main/java/org/hibernate/query/internal/AbstractCommonQueryContract.java:954
if ( binding == null || !binding.isBound() ) {
throw new IllegalStateException( "Parameter value not yet bound : " + param );
}
if ( binding.isMultiValued() ) {
// TODO: THIS IS UNSOUND, we should really throw in this case
//noinspection unchecked
return (T) binding.getBindValues();
}
else {
return binding.getBindValue();
}
}
@Override
public Object getParameterValue(@Nonnull String name) {
session.checkOpen( false );
final var binding = getQueryParameterBindings().getBinding( name );
if ( !binding.isBound() ) {
throw new IllegalStateException( "The parameter named '" + name + "' has no argument" );
}
return binding.isMultiValued() ? binding.getBindValues() : binding.getBindValue();
}
@Override
@Nullable
public Object getParameterValue(int position) {
session.checkOpen( false );
final var binding = getQueryParameterBindings().getBinding( position );
if ( !binding.isBound() ) {
throw new IllegalStateException( "The parameter at position" + position + " has no argument" );
}
return binding.isMultiValued() ? binding.getBindValues() : binding.getBindValue();
}
private <P> JavaType<P> getJavaType(Class<P> javaType) {
return getTypeConfiguration().getJavaTypeRegistry()
.resolveDescriptor( javaType );View on GitHub (pinned to fad1729dce)
Solutions
- Always bind a value — pass null explicitly if the filter is absent: query.setParameter("status", valueOrNull) is accepted for single-valued parameters
- Check bound-ness via query.isBound(query.getParameter("status")) before reading
- Bind defaults up front and overwrite later, so every named parameter is always bound
Example fix
// before Object v = query.getParameterValue( "status" ); // ISE: has no argument // after query.setParameter( "status", statusOrNull ); Object v = query.getParameterValue( "status" );
Defensive patterns
Strategy: validation
Validate before calling
if ( !query.isBound( query.getParameter( name ) ) ) {
throw new IllegalStateException( "Parameter '" + name + "' not bound yet" );
}
Object v = query.getParameterValue( name ); Try / catch
try {
return query.getParameterValue( name );
} catch ( IllegalStateException e ) {
return null; // parameter never set
} Prevention
- In dynamic filter builders, bind null or a default for every skipped named parameter
- Run value-dumping loggers only after the binding stage
- Keep named-parameter constants in one enum so names can't drift
When it happens
Trigger: query.getParameterValue("status") called before query.setParameter("status", ...). Dynamic search builders where some named parameters are skipped when the corresponding filter is absent, followed by a blanket read of all parameter values.
Common situations: Optional-filter builders that forget to bind skipped parameters; debugging/logging code that dumps all parameter values; interplay with criteria/HQL parameter names changing after a query rewrite.
Related errors
- Parameter value not yet bound : {param}
- The parameter at position{position} has no argument
- The parameter [{param}] is not part of this Query
- Null value not allowed for multi-valued parameter ':{name}'
- No parameter named ':%s' in query with named parameters [%s]
AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22).
Data as JSON: /api/errors/04d4d8a0215e62d3.
Report an issue: GitHub.