{"record":{"id":"f216b299ddb5a7e1","repo":"hibernate/hibernate-orm","slug":"couldn-t-determine-types-of-columns-of-function-j","errorCode":null,"errorMessage":"Couldn't determine types of columns of function 'json_table'","messagePattern":"Couldn't determine types of columns of function 'json_table'","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/query/sqm/tree/spi/expression/SqmJsonTableFunction.java","lineNumber":1160,"sourceCode":"\t\t\tint result = jsonPath.hashCode();\n\t\t\tresult = 31 * result + SqmCacheable.cacheHashCode( columnDefinitions );\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tpublic static final class Columns extends NestedColumns implements SqmTypedNode<Object> {\n\n\t\tpublic Columns(SqmJsonTableFunction<?> table) {\n\t\t\tsuper( \"\", table );\n\t\t}\n\n\t\tprivate Columns(SqmJsonTableFunction<?> table, ArrayList<ColumnDefinition> columnDefinitions) {\n\t\t\tsuper( \"\", table, columnDefinitions );\n\t\t}\n\n\t\tpublic AnonymousTupleType<?> createTupleType() {\n\t\t\tif ( table.columnNames.isEmpty() ) {\n\t\t\t\tthrow new IllegalArgumentException( \"Couldn't determine types of columns of function 'json_table'\" );\n\t\t\t}\n\t\t\tfinal SqmBindableType<?>[] componentTypes = new SqmBindableType<?>[table.columnNames.size()];\n\t\t\tfinal String[] componentNames = new String[table.columnNames.size()];\n\t\t\tint result = populateTupleType( 0, componentNames, componentTypes );\n\n\t\t\t// Sanity check\n\t\t\tassert result == componentTypes.length;\n\n\t\t\treturn new AnonymousTupleType<>( componentTypes, componentNames );\n\t\t}\n\n\t\t@Override\n\t\tpublic Columns copy(SqmCopyContext context) {\n\t\t\tfinal ArrayList<ColumnDefinition> definitions = new ArrayList<>( columnDefinitions.size() );\n\t\t\tfor ( ColumnDefinition columnDefinition : columnDefinitions ) {\n\t\t\t\tdefinitions.add( columnDefinition.copy( context ) );\n\t\t\t}\n\t\t\treturn new Columns( castNonNull( context.getCopy( table ) ), definitions );","sourceCodeStart":1142,"sourceCodeEnd":1178,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/spi/expression/SqmJsonTableFunction.java#L1142-L1178","documentation":"Hibernate derives json_table's result type as an AnonymousTupleType built from the declared columns (Columns.createTupleType()). If no columns were defined at all (table.columnNames is empty), there is no type to build and it throws IllegalArgumentException('Couldn't determine types of columns of function json_table'). Most dialects require an explicit COLUMNS clause for JSON_TABLE anyway.","triggerScenarios":"Creating a json_table criteria node without any columns clause and letting interpretation proceed: cb.jsonTable(doc, path) with no columns()/ordinalityColumn() call, so the lazily computed tuple type finds zero columns.","commonSituations":"Builder code that conditionally skips the columns clause; refactors that removed the columns call; assuming a columnless JSON_TABLE behaves like json_exists; adapting SQL examples that omit COLUMNS.","solutions":["Always declare at least one column (path column or ordinality column) before executing the query.","If you only need to test existence, use json_exists instead of json_table.","Guard dynamic builders: assert that at least one column was added before createQuery()."],"exampleFix":"// before\nJpaJsonTableFunction<?> t = cb.jsonTable( doc, \"$\" ); // no columns defined\n\n// after - declare at least one column\ncb.jsonTable( doc, \"$\" ).ordinalityColumn( \"n\" );   // or a full .columns(...) definition","handlingStrategy":"validation","validationCode":"int definedColumns = 0; // increment in every column()/ordinalityColumn() call\nif ( definedColumns == 0 ) {\n    throw new IllegalStateException( \"json_table requires at least one column definition\" );\n}\nreturn em.createQuery( cq );","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pair json_table with at least one column definition before createQuery().","Use json_exists for pure existence checks instead of a columnless json_table.","Add a builder assertion that counts defined columns."],"tags":["hibernate","json-table","tuple-type","columns","criteria-api"],"backgroundTag":"missing-column-definitions","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}