{"record":{"id":"d5498cfde06091d8","repo":"hibernate/hibernate-orm","slug":"jdbc-driver-does-not-support-named-parameters-for","errorCode":null,"errorMessage":"JDBC driver does not support named parameters for setArray. Use positional.","messagePattern":"JDBC driver does not support named parameters for setArray\\. Use positional\\.","errorType":"exception","errorClass":"HibernateException","httpStatus":null,"severity":"error","filePath":"hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/GaussDBArrayJdbcType.java","lineNumber":63,"sourceCode":"\t\t\tsuper( javaType, GaussDBArrayJdbcType.this );\n\t\t\tthis.pluralJavaType = pluralJavaType;\n\t\t}\n\n\t\t@Override\n\t\tprotected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)\n\t\t\t\tthrows SQLException {\n\t\t\tst.setArray( index, getArray( value, options ) );\n\t\t}\n\n\t\t@Override\n\t\tprotected void doBind(CallableStatement st, X value, String name, WrapperOptions options)\n\t\t\t\tthrows SQLException {\n\t\t\tfinal java.sql.Array arr = getArray( value, options );\n\t\t\ttry {\n\t\t\t\tst.setObject( name, arr, Types.ARRAY );\n\t\t\t}\n\t\t\tcatch (SQLException ex) {\n\t\t\t\tthrow new HibernateException(\n\t\t\t\t\t\t\"JDBC driver does not support named parameters for setArray. Use positional.\", ex );\n\t\t\t}\n\t\t}\n\n\t\t@Override\n\t\tpublic Object[] getBindValue(X value, WrapperOptions options) throws SQLException {\n\t\t\tfinal var elementBinder = getElementJdbcType().getBinder( pluralJavaType.getElementJavaType() );\n\t\t\treturn convertToArray( this, elementBinder, pluralJavaType, value, options );\n\t\t}\n\n\t\tprivate java.sql.Array getArray(X value, WrapperOptions options) throws SQLException {\n\t\t\tfinal var session = options.getSession();\n\t\t\treturn session.getJdbcCoordinator().getLogicalConnection().getPhysicalConnection()\n\t\t\t\t\t.createArrayOf( getElementTypeName( getJavaType(), session ),\n\t\t\t\t\t\t\telements( value, options, GaussDBArrayJdbcType.this ) );\n\t\t}\n\n\t\tprivate Object[] elements(X value, WrapperOptions options, GaussDBArrayJdbcType arrayJdbcType)","sourceCodeStart":45,"sourceCodeEnd":81,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/GaussDBArrayJdbcType.java#L45-L81","documentation":"GaussDBArrayJdbcType binds array values by calling CallableStatement.setObject(name, array, Types.ARRAY) when a parameter is bound by name. GaussDB's JDBC driver rejects named parameters for array binding with a SQLException, which this binder wraps in HibernateException with a message telling you to use positional parameters instead.","triggerScenarios":"Registering or binding an array-typed parameter by name on GaussDB: a StoredProcedureQuery/ProcedureCall with registerStoredProcedureParameter('param', String[].class, IN) and setParameter('param', values), or a native query with :names bound to an array/collection mapped through the array JdbcType.","commonSituations":"Stored procedures taking VARRAY/array arguments migrated from PostgreSQL (where named binding works) to GaussDB; @NamedStoredProcedureQuery entities with array IN parameters; native upsert queries binding collections by name on GaussDB.","solutions":["Bind by position instead of name: use registerStoredProcedureParameter(1, String[].class, ParameterMode.IN) and setParameter(1, values), or ?1 placeholders in native queries","If the procedure signature allows, pass the array as a delimited string and split server-side","Replace the stored-procedure array parameter with a temp-table or JSON parameter approach supported by the driver","Check for an updated GaussDB driver - named setArray support is a driver limitation - but keep positional binding as the portable form"],"exampleFix":"// before (named parameter, driver throws -> HibernateException)\nStoredProcedureQuery q = em.createStoredProcedureQuery(\"save_tags\");\nq.registerStoredProcedureParameter(\"tags\", String[].class, ParameterMode.IN);\nq.setParameter(\"tags\", tags);\n\n// after (positional binding)\nStoredProcedureQuery q = em.createStoredProcedureQuery(\"save_tags\");\nq.registerStoredProcedureParameter(1, String[].class, ParameterMode.IN);\nq.setParameter(1, tags);","handlingStrategy":"fallback","validationCode":"// detect GaussDB array + named binding before executing\nboolean gauss = sessionFactory.getJdbcServices().getDialect() instanceof GaussDBDialect;\nif (gauss && usesNamedArrayParam(query)) {\n    query = convertToPositionalBinding(query); // :tags -> ?1, setParameter(1, tags)\n}","typeGuard":"static boolean namedArrayBindingSafe(Dialect d) {\n    return !(d instanceof GaussDBDialect);\n}","tryCatchPattern":"try {\n    proc.setParameter(\"tags\", tags).execute();\n} catch (org.hibernate.HibernateException e) {\n    if (e.getMessage().contains(\"named parameters for setArray\")) {\n        // retry with positional binding: setParameter(1, tags)\n    } else throw e;\n}","preventionTips":["Use positional parameter binding for array/collection parameters everywhere - it works on all drivers","Audit StoredProcedureQuery/@NamedStoredProcedureQuery definitions for named array IN parameters when targeting GaussDB","Keep a GaussDB instance in the CI matrix for procedure-heavy modules"],"tags":["hibernate","gaussdb","jdbc","stored-procedure","array-binding","named-parameters"],"backgroundTag":"named-parameter-binding-unsupported","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}