{"record":{"id":"ad13ab9d5263d0ec","repo":"hibernate/hibernate-orm","slug":"cannot-parse-given-string-into-array-of-strings-f","errorCode":null,"errorMessage":"Cannot parse given string into array of strings. First and last character must be { and }","messagePattern":"Cannot parse given string into array of strings\\. First and last character must be (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ArrayJavaType.java","lineNumber":194,"sourceCode":"\t\t\t}\n\t\t\tsb.append( '\"' );\n\t\t\tglue = \",\";\n\t\t}\n\t\tsb.append( '}' );\n\t\treturn sb.toString();\n\t}\n\n\t@Override\n\tpublic T[] fromString(CharSequence charSequence) {\n\t\tif ( charSequence == null ) {\n\t\t\treturn null;\n\t\t}\n\t\tfinal var lst = new java.util.ArrayList<String>();\n\t\tStringBuilder sb = null;\n\t\tchar lastChar = charSequence.charAt( charSequence.length() - 1 );\n\t\tchar firstChar = charSequence.charAt( 0 );\n\t\tif ( firstChar != '{' || lastChar != '}' ) {\n\t\t\tthrow new IllegalArgumentException( \"Cannot parse given string into array of strings. First and last character must be { and }\" );\n\t\t}\n\t\tint len = charSequence.length();\n\t\tboolean inquote = false;\n\t\tfor ( int i = 1; i < len; i ++ ) {\n\t\t\tchar c = charSequence.charAt( i );\n\t\t\tif ( c == '\"' ) {\n\t\t\t\tif (inquote) {\n\t\t\t\t\tlst.add( sb.toString() );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tsb = new StringBuilder();\n\t\t\t\t}\n\t\t\t\tinquote = !inquote;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse if ( !inquote ) {\n\t\t\t\tif ( Character.isWhitespace( c ) ) {\n\t\t\t\t\tcontinue;","sourceCodeStart":176,"sourceCodeEnd":212,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ArrayJavaType.java#L176-L212","documentation":"ArrayJavaType.fromString parses the PostgreSQL-style array literal that some drivers/dialects hand back for array columns when no native array object is available. It requires the text to start with '{' and end with '}'; anything else is rejected with this IllegalArgumentException.","triggerScenarios":"Reading an array-typed attribute where the JDBC driver returns the value as a String whose format is not '{...}' - e.g. application code or a converter stored 'a,b,c' instead of '{a,b,c}', or a raw VARCHAR column was mapped as an array type.","commonSituations":"Hand-written data or ETL loading arrays as delimited text; migrating a varchar column to an array mapping without converting data; custom converters producing non-PG-literal output; unit tests stubbing array values with plain comma-separated strings.","solutions":["Store/produce values in PostgreSQL array literal form: '{elem,elem}'","Quote elements containing commas, braces or quotes: '{\"a,b\",c}' and escape embedded quotes/backslashes","Convert the varchar column to a real array column (or map it as String and split in a converter)","If a converter formats the relational form, emit '{' + joined + '}'"],"exampleFix":"// before\nconverter writes: \"ONE,TWO,THREE\"        // fromString -> IllegalArgumentException\nstub value:     \"[ONE, TWO, THREE]\"       // Java Arrays.toString format\n// after\nconverter writes: \"{ONE,TWO,THREE}\"      // valid PG array literal\nstub value:     \"{ONE,TWO,THREE}\"","handlingStrategy":"validation","validationCode":"// validate/normalize stored text before Hibernate parses it\nstatic String toPgArrayLiteral(String raw) {\n    String s = raw == null ? \"{}\" : raw.trim();\n    if (!s.startsWith(\"{\") || !s.endsWith(\"}\")) {\n        s = '{' + Arrays.stream(s.split(\",\")).map(String::trim)\n                           .map(e -> e.matches(\"[A-Za-z0-9_]*\") ? e : '\"' + e + '\"')\n                           .collect(Collectors.joining(\",\")) + '}';\n    }\n    return s;\n}","typeGuard":"static boolean isParsableArrayLiteral(CharSequence s) {\n    return s != null && s.length() >= 2 && s.charAt(0) == '{' && s.charAt(s.length() - 1) == '}';\n}","tryCatchPattern":"try {\n    return session.find(Document.class, id);\n} catch (IllegalArgumentException e) {\n    if (String.valueOf(e.getMessage()).contains(\"First and last character must be { and }\")) {\n        // column holds non-literal text: repair row or remap column as String + converter\n        log.error(\"Malformed array literal in row {}\", id);\n    } else throw e;\n}","preventionTips":["Write arrays through the driver/ORM, never by string concatenation","Store '{e1,e2}' PG literal format in any varchar backing an array mapping","Add CHECK constraints (value LIKE '{%}') to catch stray formats early","Quote elements containing commas, braces or quotes"],"tags":["hibernate","orm","array-mapping","parsing","postgresql","data-format"],"backgroundTag":"array-literal-parse-error","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}