{"record":{"id":"579a71489512ff8c","repo":"hibernate/hibernate-orm","slug":"jdbc-driver-does-not-support-named-parameters-for-579a71","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-core/src/main/java/org/hibernate/type/descriptor/jdbc/ArrayJdbcType.java","lineNumber":239,"sourceCode":"\t\t\tsuper( javaType, ArrayJdbcType.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 var array = getArray( value, options );\n\t\t\ttry {\n\t\t\t\tst.setObject( name, array, 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\tgetBindValue( value, options ) );\n\t\t}\n\t}\n","sourceCodeStart":221,"sourceCodeEnd":257,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/ArrayJdbcType.java#L221-L257","documentation":"CallableStatement has no setArray(String, Array), so when Hibernate binds an array to a named stored-procedure parameter it falls back to st.setObject(name, array, Types.ARRAY). If the JDBC driver rejects that call, Hibernate wraps the SQLException in HibernateException('JDBC driver does not support named parameters for setArray. Use positional.'). The failure is a driver capability gap, not a data problem - the fix is positional binding, which uses the real setArray(index, ...).","triggerScenarios":"StoredProcedureQuery or CallableStatement with a named parameter and an array-typed argument (e.g., an Oracle ARRAY / postgres array type), executed on a driver whose setObject(name, ..., Types.ARRAY) throws SQLException.","commonSituations":"Oracle thin driver versions that do not accept named-parameter setObject with Types.ARRAY; stored procedures taking collection/table parameters; code migrated from positional to named parameters during refactor; older bundled drivers in app servers.","solutions":["Register and bind the array parameter by position instead of by name so the binder uses setArray(index, array).","Upgrade the JDBC driver to a version that supports setObject with Types.ARRAY on named parameters.","As a stopgap, pass the array in a serialized form (CSV or JSON string) and unpack it inside the procedure."],"exampleFix":"// before\nStoredProcedureQuery q = em.createStoredProcedureQuery(\"my_pkg.load_ids\");\nq.registerStoredProcedureParameter(\"p_ids\", Object[].class, ParameterMode.IN);\nq.setParameter(\"p_ids\", ids); // named + array -> driver rejects setObject\n\n// after: positional parameters use setArray\nStoredProcedureQuery q = em.createStoredProcedureQuery(\"my_pkg.load_ids\");\nq.registerStoredProcedureParameter(1, Object[].class, ParameterMode.IN);\nq.setParameter(1, ids);","handlingStrategy":"fallback","validationCode":"// Probe once per driver: can it bind arrays to named parameters?\nstatic boolean namedArrayBindingSupported(Connection c) throws Exception {\n    try (Connection conn = c) {\n        // driver-specific; simplest robust policy: treat Oracle-style drivers as unsupported\n        return !c.getMetaData().getDatabaseProductName().toLowerCase().contains(\"oracle\");\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    query.setParameter(\"p_ids\", arrayValue).execute();\n} catch (org.hibernate.HibernateException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"named parameters for setArray\")) {\n        // re-register the parameter positionally and re-run: binder will use setArray(index, ...)\n    } else {\n        throw e;\n    }\n}","preventionTips":["Prefer positional parameters for stored procedures that take arrays","Keep the JDBC driver up to date and note named-parameter array support in driver release notes","Wrap stored-procedure calls in a repository method so the binding style is fixed in one place"],"tags":["hibernate","stored-procedure","array","jdbc-driver","named-parameters"],"backgroundTag":"jdbc-driver-compatibility","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}