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

  1. Always bind a value — pass null explicitly if the filter is absent: query.setParameter("status", valueOrNull) is accepted for single-valued parameters
  2. Check bound-ness via query.isBound(query.getParameter("status")) before reading
  3. 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

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


AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22). Data as JSON: /api/errors/04d4d8a0215e62d3. Report an issue: GitHub.