hibernate/hibernate-orm · error · IllegalStateException

Map instantiation contained one or more arguments with no…

Error message

Map instantiation contained one or more arguments with no alias

What it means

Thrown by DynamicInstantiationResultImpl.createResultAssembler when a `select new map(...)` query has at least one argument without an alias. This is the primary validation point and fires during query-plan creation (usually on first execution of the query). Because the alias becomes the map key, an unaliased argument makes the Map result impossible to construct.

Solutions

  1. Alias every argument in the map instantiation: `select new map(e.id as id, e.name as name)`
  2. If a wrapper Map is genuinely wanted without keys, switch to `new list(...)` where aliases are optional
  3. For Criteria API, set an alias on each Selection before adding it to the compound selection

Example fix

// before
List<Map<?,?>> rows = session.createQuery("select new map(e.id, e.name) from Employee e", Map.class).getResultList();
// after
List<Map<?,?>> rows = session.createQuery("select new map(e.id as id, e.name as name) from Employee e", Map.class).getResultList();
Defensive patterns

Strategy: validation

Validate before calling

// With Criteria API, fail fast before execution if any selection lacks an alias
List<Selection<?>> parts = cb.construct? null : null; // (illustrative)
for (Selection<?> s : compoundSelections) {
    if (s.getAlias() == null) throw new IllegalStateException("Selection needs alias for map instantiation: " + s);
}

Prevention

When it happens

Trigger: Executing `select new map(e.id, e.name) from Employee e` via `session.createQuery(...).getResultList()`; criteria query with DynamicInstantiationNature.MAP where selections lack aliases; first request after deployment triggers plan creation and fails.

Common situations: Developers writing `new map(...)` for the first time and not knowing aliases are mandatory; queries migrated from `new list(...)` or from native SQL; integration tests that only run the query late in the build, surfacing the failure at runtime instead of compile time.

Related errors


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

Appendix: source

Thrown at hibernate-core/src/main/java/org/hibernate/sql/results/graph/instantiation/internal/DynamicInstantiationResultImpl.java:137

	@SuppressWarnings("unchecked")
	private DomainResultAssembler<R> resolveAssembler(
			boolean areAllArgumentsAliased,
			boolean areAnyArgumentsAliased,
			List<String> duplicatedAliases,
			List<ArgumentReader<?>> argumentReaders,
			AssemblerCreationState creationState) {

		if ( nature == DynamicInstantiationNature.LIST ) {
			if ( LOG.isDebugEnabled() && areAnyArgumentsAliased ) {
				LOG.debug( "One or more arguments for List dynamic instantiation (`new list(...)`) specified an alias; ignoring" );
			}
			return (DomainResultAssembler<R>)
					new DynamicInstantiationAssemblerListImpl( (JavaType<List<?>>) javaType, argumentReaders );
		}
		else if ( nature == DynamicInstantiationNature.MAP ) {
			if ( ! areAllArgumentsAliased ) {
				throw new IllegalStateException( "Map instantiation contained one or more arguments with no alias" );
			}
			if ( !duplicatedAliases.isEmpty() ) {
				throw new IllegalStateException(
						"Map instantiation has arguments with duplicate aliases ["
								+ StringHelper.join( ",", duplicatedAliases ) + "]"
				);
			}
			return (DomainResultAssembler<R>)
					new DynamicInstantiationAssemblerMapImpl( (JavaType<Map<?,?>>) javaType, argumentReaders );
		}
		else {
			return assembler( areAllArgumentsAliased, duplicatedAliases, argumentReaders, creationState );
		}
	}

	private DomainResultAssembler<R> assembler(
			boolean areAllArgumentsAliased,
			List<String> duplicatedAliases,

View on GitHub (pinned to fad1729dce)