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();
}
}
@OverrideView on GitHub (pinned to fad1729dce)
Solutions
- 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
- Do not cache or share Parameter objects across query instances
- 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
- Never cache or share Parameter objects across query instances
- Use getParameterValue(String)/(int) instead of Parameter objects in application code
- Keep (query, parameter) pairs together in one scope so mismatches are impossible
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
- Type specified for parameter named '{name}' is incompatible
- Type specified for parameter at position {position} is incom
- Parameter value not yet bound : {param}
- The parameter named '{name}' has no argument
- The parameter at position{position} has no argument
AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22).
Data as JSON: /api/errors/8fcc17af2dcd7f0d.
Report an issue: GitHub.