hibernate/hibernate-orm · error · IllegalArgumentException

The parameter [{param}] is not part of this Query

Error message

The parameter [{param}] is not part of this Query

What it means

Thrown by getParameterValue(Parameter<T> param) when getParameterMetadata().resolve(param) returns null, i.e. the jakarta Parameter object you passed does not correspond to any parameter declared by THIS query. resolve matches by name (for named parameters) or position (for ordinal ones); a Parameter from another query, a hand-constructed ParameterImpl, or one whose name/position never appears in this query resolves to null and this IllegalArgumentException fires.

Source

Thrown at hibernate-core/src/main/java/org/hibernate/query/internal/AbstractCommonQueryContract.java:931

						"Type specified for parameter at position " + position + " is incompatible"
						+ " (" + parameterType.getName() + " is not assignable to " + type.getName() + ")"
				);
			}
			@SuppressWarnings("unchecked") // safe, just checked
			var castParameter = (QueryParameterImplementor<T>) parameter;
			return castParameter;
		}
		catch ( HibernateException e ) {
			throw getExceptionConverter().convert( e );
		}
	}

	@Override
	public <T> T getParameterValue(@Nonnull Parameter<T> param) {
		session.checkOpen( false );
		final var parameter = getParameterMetadata().resolve( param );
		if ( parameter == null ) {
			throw new IllegalArgumentException( "The parameter [" + param + "] is not part of this Query" );
		}
		final var binding =
				getQueryParameterBindings()
						.getBinding( getQueryParameter( parameter ) );
		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

View on GitHub (pinned to fad1729dce)

Solutions

  1. Obtain the Parameter from the same query instance right before use: query.getParameterValue(query.getParameter("name")) — or simpler, call query.getParameterValue("name") / (int position) directly
  2. Do not cache or share Parameter objects across query instances
  3. Validate first: query.getParameters().contains(param) before calling getParameterValue

Example fix

// before
Parameter<?> p = otherQuery.getParameter( "customerId" );
Object v = query.getParameterValue( p ); // not part of this Query

// after
Object v = query.getParameterValue( "customerId" );
Defensive patterns

Strategy: validation

Validate before calling

if ( !query.getParameters().contains( param ) ) {
    throw new IllegalArgumentException( "Parameter " + param + " does not belong to this query" );
}
Object v = query.getParameterValue( param );

Type guard

static boolean isParameterOf(jakarta.persistence.Query q, Parameter<?> p) {
    return q.getParameters().contains( p );
}

Prevention

When it happens

Trigger: query.getParameterValue(paramFromAnotherQuery) where paramFromAnotherQuery came from otherQuery.getParameters() or otherQuery.getParameter("x"). Passing a Parameter obtained before the query was rewritten (e.g. after flush-mode re-creation). A Parameter whose position exceeds the ordinal count of this query.

Common situations: Utility methods that accept (Query, Parameter) pairs and are called with mismatched pairs; caching Parameter objects statically and reusing them for freshly created queries; refactoring named→positional parameters while Parameter handles keep circulating.

Related errors


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