hibernate/hibernate-orm · error · HibernateException
JDBC driver does not support named parameters for setArray.
Error message
JDBC driver does not support named parameters for setArray. Use positional.
What it means
Binding a PostgreSQL array to a stored-procedure call by parameter name: PostgreSQLArrayJdbcType first binds positionally via setArray, but for named CallableStatement parameters it must use setObject(name, array, Types.ARRAY). PgJDBC does not support named parameters on CallableStatement, so the driver throws and Hibernate wraps it with this message. The array mapping itself is fine - the named-parameter bind path is the unsupported part.
Source
Thrown at hibernate-core/src/main/java/org/hibernate/dialect/type/PostgreSQLArrayJdbcType.java:58
private Binder(JavaType<X> javaType, BasicPluralJavaType<E> pluralJavaType) {
super( javaType, PostgreSQLArrayJdbcType.this );
this.pluralJavaType = pluralJavaType;
}
@Override
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException {
st.setArray( index, getArray( value, options ) );
}
@Override
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
throws SQLException {
final java.sql.Array arr = getArray( value, options );
try {
st.setObject( name, arr, java.sql.Types.ARRAY );
}
catch (SQLException ex) {
throw new HibernateException( "JDBC driver does not support named parameters for setArray. Use positional.", ex );
}
}
@Override
public Object[] getBindValue(X value, WrapperOptions options) throws SQLException {
final var elementBinder = getElementJdbcType().getBinder( pluralJavaType.getElementJavaType() );
return convertToArray( this, elementBinder, pluralJavaType, value, options );
}
private java.sql.Array getArray(X value, WrapperOptions options) throws SQLException {
final var session = options.getSession();
return session.getJdbcCoordinator().getLogicalConnection().getPhysicalConnection()
.createArrayOf( getElementTypeName( getJavaType(), session ),
elements( value, options, PostgreSQLArrayJdbcType.this ) );
}
private Object[] elements(X value, WrapperOptions options, PostgreSQLArrayJdbcType arrayJdbcType)
throws SQLException {View on GitHub (pinned to fad1729dce)
Solutions
- Use positional parameter binding for the procedure call (registerStoredProcedureParameter(1, ...) and setParameter(1, ...)).
- Rewrite the call as a native query with ? placeholders and setParameter(int, Object[]) so the driver builds the array.
- Upgrade PgJDBC and retest if you must keep named parameters.
- Change the function signature to accept a comma-separated string (string_to_array inside the function) instead of an array parameter.
Example fix
// before - named parameter, PgJDBC rejects it
StoredProcedureQuery q = em.createStoredProcedureQuery("take_ids(text[])");
q.registerStoredProcedureParameter("p_ids", Object[].class, ParameterMode.IN);
q.setParameter("p_ids", ids);
// after - positional binding via setArray path
StoredProcedureQuery q = em.createStoredProcedureQuery("take_ids(text[])");
q.registerStoredProcedureParameter(1, Object[].class, ParameterMode.IN);
q.setParameter(1, ids); Defensive patterns
Strategy: fallback
Validate before calling
// Detect PgJDBC before relying on named array binds
String url = dataSource.getConnection().getMetaData().getURL();
boolean isPg = url.startsWith("jdbc:postgresql:");
// if isPg -> register procedure parameters positionally from the start Try / catch
try {
query.setParameter("p_ids", ids); // named
} catch (HibernateException e) {
if (e.getMessage() != null && e.getMessage().contains("named parameters for setArray")) {
query.setParameter(1, ids); // PgJDBC: positional only
} else throw e;
} Prevention
- Use positional ? parameters for every PostgreSQL function call that takes arrays.
- Prefer native queries with typed parameter binding for array-returning/accepting functions.
- Track PgJDBC named-parameter support in your pinned driver version before writing named calls.
When it happens
Trigger: StoredProcedureQuery / @ProcedureCall against PostgreSQL with a named IN parameter bound to an array-mapped attribute (e.g. setParameter("p_ids", list) where the parameter is a text[]/int[] type). The PgJDBC call setObject(name, ...) fails and this exception is thrown at bind time.
Common situations: Calling PL/pgSQL functions taking VARIADIC or array parameters through JPA named parameters; porting Oracle-style named procedure calls to PostgreSQL; older PgJDBC versions with no partial named-parameter support.
Related errors
- JDBC driver does not support named parameters for setArray.
- Cannot mix named parameters and REF_CURSOR parameter on Post
- JDBC driver does not support named parameters for setArray.
- JDBC driver does not support named parameters for setArray.
- GaussDB only supports accessing REF_CURSOR parameters by pos
AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22).
Data as JSON: /api/errors/80849b5bfab47ed6.
Report an issue: GitHub.