hibernate/hibernate-orm · error · IllegalArgumentException
No parameter named ':%s' in query with named parameters [%s]
Error message
No parameter named ':%s' in query with named parameters [%s]
What it means
ParameterMetadataImpl.getQueryParameter(String) looks a parameter up by name in queryParametersByName; when it is absent, Hibernate throws IllegalArgumentException (cause UnknownParameterException) and the message conveniently lists every named parameter the query actually declares. It fires from setParameter(name, ...) or getParameter(name) on a query that has no such :name token.
Source
Thrown at hibernate-core/src/main/java/org/hibernate/query/internal/ParameterMetadataImpl.java:268
@Override
public QueryParameterImplementor<?> findQueryParameter(String name) {
return queryParametersByName == null ? null : queryParametersByName.get( name );
}
@Override
public QueryParameterImplementor<?> getQueryParameter(String name) {
final var parameter = findQueryParameter( name );
if ( parameter != null ) {
return parameter;
}
else {
final String errorMessage = String.format(
Locale.ROOT,
"No parameter named ':%s' in query with named parameters [%s]",
name,
String.join( ", ", getNamedParameterNames() )
);
throw new IllegalArgumentException(
errorMessage,
new UnknownParameterException( errorMessage )
);
}
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Positional parameter handling
@Override
public boolean hasPositionalParameters() {
return queryParametersByPosition != null && !queryParametersByPosition.isEmpty();
}
public Set<Integer> getOrdinalParameterLabels() {
return queryParametersByPosition == null ? emptySet() : queryParametersByPosition.keySet();
}View on GitHub (pinned to fad1729dce)
Solutions
- Read the parameter list in the error message (or call query.getParameterMetadata().getNamedParameterNames()) and bind using one of those exact names.
- Fix the typo on either side so the HQL token and the setParameter name match.
- In dynamic query builders, add the predicate and its binding in the same conditional block so names cannot drift.
Example fix
// before
var q = session.createQuery("from Person p where p.status = :stat", Person.class);
q.setParameter("status", "ACTIVE"); // throws: no parameter named ':status'
// after
q.setParameter("stat", "ACTIVE"); // matches :stat in the HQL Defensive patterns
Strategy: validation
Validate before calling
static void requireNamedParam(org.hibernate.query.Query<?> q, String name) {
if (!q.getParameterMetadata().getNamedParameterNames().contains(name))
throw new IllegalArgumentException("Query declares no parameter :" + name
+ " - declared: " + q.getParameterMetadata().getNamedParameterNames());
} Prevention
- Derive binding names from a single constants class shared with the HQL strings.
- In dynamic builders, append predicate and binding together in one method.
- Write a smoke test per repository method that executes each query with dummy bindings.
When it happens
Trigger: Calling setParameter("status", value) on a query whose HQL contains no :status placeholder; calling getParameter("x") on a query that uses different parameter names or only ordinal ?N parameters.
Common situations: Typos between the HQL string and the binding call; refactoring a query string (renaming or removing a parameter) without updating bindings; dynamic query builders where a predicate is appended but its binding is missing or uses a stale name.
Related errors
- The parameter named '{name}' has no argument
- No parameter labelled '?%s' in query with ordinal parameters
- No argument for named parameter ':{}'
- Could not resolve attribute '%s' of '%s'
- Could not resolve attribute '${name}' of '${returnedClassNam
AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22).
Data as JSON: /api/errors/cd7f12d3355fe2c2.
Report an issue: GitHub.