hibernate/hibernate-orm · error · QueryException

JSON path [" + jsonPath + "] uses parameter [" + parameterNa

Error message

JSON path [" + jsonPath + "] uses parameter [" + parameterName + "] that is not passed

What it means

The literal JSON path passed to json_value() contains a '$name' variable reference (from HQL's PASSING clause, e.g. '$.items[$idx]' passing idx). While expanding path elements into json_extract_string arguments, the SingleStore dialect hits a JsonParameterIndexAccess element and throws this QueryException, because passed parameters cannot be injected into the generated SQL.

Source

Thrown at hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/function/json/SingleStoreJsonValueFunction.java:66

		}
		final String jsonPath;
		try {
			jsonPath = walker.getLiteralValue( arguments.jsonPath() );
		}
		catch (Exception ex) {
			throw new QueryException( "SingleStore json_value only support literal json paths, but got " + arguments.jsonPath() );
		}
		final List<JsonPathHelper.JsonPathElement> jsonPathElements = JsonPathHelper.parseJsonPathElements( jsonPath );
		sqlAppender.appendSql( "json_extract_string(" );
		arguments.jsonDocument().accept( walker );
		for ( JsonPathHelper.JsonPathElement pathElement : jsonPathElements ) {
			sqlAppender.appendSql( ',' );
			if ( pathElement instanceof JsonPathHelper.JsonAttribute attribute ) {
				sqlAppender.appendSingleQuoteEscapedString( attribute.attribute() );
			}
			else if ( pathElement instanceof JsonPathHelper.JsonParameterIndexAccess indexParameter) {
				final String parameterName = indexParameter.parameterName();
				throw new QueryException( "JSON path [" + jsonPath + "] uses parameter [" + parameterName + "] that is not passed" );
			}
			else {
				sqlAppender.appendSql( '\'' );
				sqlAppender.appendSql( ( (JsonPathHelper.JsonIndexAccess) pathElement ).index() );
				sqlAppender.appendSql( '\'' );
			}
		}
		sqlAppender.appendSql( ')' );
		if ( arguments.returningType() != null ) {
			if ( arguments.returningType().getJdbcMapping().getJdbcType().isBoolean() ) {
				sqlAppender.append( " when 'true' then true when 'false' then false end " );
			}
			else {
				sqlAppender.appendSql( " as " );
				arguments.returningType().accept( walker );
				sqlAppender.appendSql( ')' );
			}
		}

View on GitHub (pinned to fad1729dce)

Solutions

  1. Replace the $param reference with a literal index: '$.arr[0]'.
  2. Interpolate the index into a literal path built in Java (validate it is an integer).
  3. Extract the array with json_query and index it in Java.
  4. Fall back to native SQL with json_extract and a bound index.

Example fix

// before - throws: $i is a path parameter
select json_value(e.doc, '$.items[$i]' passing e.idx as i) from Event e

// after - literal index
select json_value(e.doc, '$.items[2]') from Event e
Defensive patterns

Strategy: fallback

Validate before calling

if (path.indexOf('$', 1) >= 0) throw new IllegalArgumentException("$param path unsupported on SingleStore: " + path);
String literalPath = "$.items[" + requireInt(index) + "]";

Try / catch

try {
    return session.createQuery(hql, String.class).getSingleResult();
} catch (QueryException e) {
    if (e.getMessage().contains("that is not passed")) {
        return extractInJava(session); // fetch array, index in Java
    }
    throw e;
}

Prevention

When it happens

Trigger: HQL like: select json_value(e.doc, '$.arr[$i]' passing e.idx as i) from Event e - any $param index reference inside the jsonpath of a json_value call on SingleStore.

Common situations: Runtime-selected array element extraction; queries shared across databases that rely on the PASSING clause; porting Oracle-style parametrized paths to SingleStore.

Related errors


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