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

  1. Read the parameter list in the error message (or call query.getParameterMetadata().getNamedParameterNames()) and bind using one of those exact names.
  2. Fix the typo on either side so the HQL token and the setParameter name match.
  3. 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

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


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