{"record":{"id":"d33fa586b39e83d6","repo":"hibernate/hibernate-orm","slug":"informix-does-not-support-binary-literals","errorCode":null,"errorMessage":"Informix does not support binary literals","messagePattern":"Informix does not support binary literals","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java","lineNumber":901,"sourceCode":"\t\t\t\tcase STRING:\n\t\t\t\t\treturn \"trim(case ?1 when 't' then 'true' when 'f' then 'false' else null end)\";\n\t\t\t\tcase TF_BOOLEAN:\n\t\t\t\t\treturn \"upper(cast(?1 as varchar))\";\n\t\t\t\tcase YN_BOOLEAN:\n\t\t\t\t\treturn \"case ?1 when 't' then 'Y' when 'f' then 'N' else null end\";\n\t\t\t\tcase INTEGER_BOOLEAN:\n\t\t\t\t\treturn \"case ?1 when 't' then 1 when 'f' then 0 else null end\";\n\t\t\t}\n\t\t}\n\t\tif ( from == CastType.STRING && to == CastType.BOOLEAN ) {\n\t\t\treturn buildStringToBooleanCast( \"'t'\", \"'f'\" );\n\t\t}\n\t\treturn super.castPattern( from, to );\n\t}\n\n\t@Override\n\tpublic void appendBinaryLiteral(SqlAppender appender, byte[] bytes) {\n\t\tthrow new UnsupportedOperationException( \"Informix does not support binary literals\" );\n\t}\n\n\t@Override\n\tpublic String getCatalogSeparator() {\n\t\treturn \":\";\n\t}\n\n\t@Override\n\tpublic SqmMultiTableMutationStrategy getFallbackSqmMutationStrategy(\n\t\t\tEntityMappingType rootEntityDescriptor,\n\t\t\tRuntimeModelCreationContext runtimeModelCreationContext) {\n\t\treturn new LocalTemporaryTableMutationStrategy( rootEntityDescriptor, runtimeModelCreationContext );\n\t}\n\n\t@Override\n\tpublic SqmMultiTableInsertStrategy getFallbackSqmInsertStrategy(\n\t\t\tEntityMappingType rootEntityDescriptor,\n\t\t\tRuntimeModelCreationContext runtimeModelCreationContext) {","sourceCodeStart":883,"sourceCodeEnd":919,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java#L883-L919","documentation":"InformixDialect.appendBinaryLiteral() throws because Informix SQL has no binary/hex literal syntax that Hibernate could inline. appendBinaryLiteral() is only called when Hibernate decides to render a binary (byte[]) value directly into the SQL text rather than binding it as a JDBC parameter, so this error means a byte[] constant was inlined into the statement.","triggerScenarios":"A criteria or HQL query that compares or IN-lists a binary column against an inlined byte[] constant on InformixDialect — typically criteria queries with literal handling mode 'inline' (hibernate.query.criteria.literal_handling_mode=inline) or a literal passed where a parameter was expected, e.g. cb.equal(root.get(\"contentHash\"), hashBytes).","commonSituations":"Entities storing UUID/hashes as byte[] or VARBINARY compared with constants; teams setting criteria literal-handling to inline for execution-plan stability or to work around parameter-length limits; migration of such queries to Informix.","solutions":["Bind the binary value as a parameter: use a criteria ParameterExpression or HQL :param with setParameter instead of an inlined literal","Remove hibernate.query.criteria.literal_handling_mode=inline (default BIND mode keeps byte[] values as JDBC parameters)","If the DB design allows, store the binary value as a hex/base64 VARCHAR and compare string literals instead"],"exampleFix":"// before - value inlined, calls appendBinaryLiteral on Informix\ncb.equal(root.get(\"contentHash\"), hashBytes);\n\n// after - bind as parameter\nParameterExpression<byte[]> p = cb.parameter(byte[].class);\ncb.equal(root.get(\"contentHash\"), p);\nquery.setParameter(p, hashBytes);","handlingStrategy":"validation","validationCode":"// bind binary values instead of inlining them\n// criteria: always go through a parameter\nParameterExpression<byte[]> hash = cb.parameter(byte[].class);\nPredicate eq = cb.equal(root.get(\"contentHash\"), hash);\n// and keep literal handling on the default BIND mode:\n// cfg.setProperty(AvailableSettings.CRITERIA_LITERAL_HANDLING_MODE, \"bind\");","typeGuard":null,"tryCatchPattern":"try {\n    return session.createQuery(cq).getResultList();\n} catch (UnsupportedOperationException e) {\n    if ( String.valueOf(e.getMessage()).contains(\"binary literals\") ) {\n        // re-issue the query with the value bound as a parameter\n    }\n    throw e;\n}","preventionTips":["Never inline byte[] constants in criteria/HQL - always bind via setParameter","Do not set hibernate.query.criteria.literal_handling_mode=inline on Informix","For hash/UUID lookups, consider storing a hex-string column for portable literal comparisons"],"tags":["hibernate","informix","binary","varbinary","literal","criteria"],"backgroundTag":"binary-literal-unsupported","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}