{"record":{"id":"8bd92243d6dab48e","repo":"hibernate/hibernate-orm","slug":"constructorresult-did-not-define-any-columnresults","errorCode":null,"errorMessage":"ConstructorResult did not define any ColumnResults","messagePattern":"ConstructorResult did not define any ColumnResults","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/boot/query/SqlResultSetMappingDescriptor.java","lineNumber":243,"sourceCode":"\t\tprivate final String mappingName;\n\n\t\tprivate final Class<?> targetJavaType;\n\t\tprivate final List<ArgumentDescriptor> argumentResultDescriptors;\n\n\t\tpublic ConstructorResultDescriptor(\n\t\t\t\tConstructorResult constructorResult,\n\t\t\t\tString mappingName) {\n\t\t\tthis.mappingName = mappingName;\n\t\t\ttargetJavaType = constructorResult.targetClass();\n\t\t\targumentResultDescriptors = interpretArguments( constructorResult, mappingName );\n\t\t}\n\n\t\tprivate static List<ArgumentDescriptor> interpretArguments(\n\t\t\t\tConstructorResult constructorResult,\n\t\t\t\tString mappingName) {\n\t\t\tfinal var columnResults = constructorResult.columns();\n\t\t\tif ( isEmpty( columnResults ) ) {\n\t\t\t\tthrow new IllegalArgumentException( \"ConstructorResult did not define any ColumnResults\" );\n\t\t\t}\n\n\t\t\tfinal List<ArgumentDescriptor> argumentResultDescriptors = arrayList( columnResults.length );\n\t\t\tfor ( var columnResult : columnResults ) {\n\t\t\t\tfinal var argumentResultDescriptor =\n\t\t\t\t\t\tnew JpaColumnResultDescriptor( columnResult, mappingName );\n\t\t\t\targumentResultDescriptors.add( new ArgumentDescriptor(argumentResultDescriptor) );\n\t\t\t}\n\t\t\treturn argumentResultDescriptors;\n\t\t}\n\n\t\t@Nonnull\n\t\t@Override\n\t\tpublic ResultMemento resolve(@Nonnull ResultSetMappingResolutionContext resolutionContext) {\n\t\t\tBOOT_QUERY_LOGGER.tracef(\n\t\t\t\t\t\"Generating InstantiationResultMappingMemento for JPA ConstructorResult(%s) for ResultSet mapping `%s`\",\n\t\t\t\t\ttargetJavaType.getName(),\n\t\t\t\t\tmappingName","sourceCodeStart":225,"sourceCodeEnd":261,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/boot/query/SqlResultSetMappingDescriptor.java#L225-L261","documentation":"While interpreting a @SqlResultSetMapping's @ConstructorResult, Hibernate reads constructorResult.columns() and immediately throws this IllegalArgumentException when the array is empty. A constructor result maps each constructor argument from a column, so at least one @ColumnResult is required for the mapping to be meaningful.","triggerScenarios":"@ConstructorResult(targetClass = OrderTotal.class, columns = {}); a @SqlResultSetMapping built reflectively or generated where the columns array was never populated.","commonSituations":"Annotation scaffolding left half-finished; refactoring that removed columns but kept the constructor result; tools that generate @SqlResultSetMapping skeletons.","solutions":["Add at least one @ColumnResult whose name matches a column of the native query and whose type matches a constructor parameter.","Verify every constructor parameter of targetClass has a matching @ColumnResult (count and order).","If the constructor result is not needed, delete the whole @ConstructorResult entry from @SqlResultSetMapping(classes = ...)."],"exampleFix":"// before\n@SqlResultSetMapping(classes = {\n    @ConstructorResult(targetClass = OrderTotal.class, columns = {})\n})\n\n// after\n@SqlResultSetMapping(classes = {\n    @ConstructorResult(\n        targetClass = OrderTotal.class,\n        columns = { @ColumnResult(name = \"orderId\"), @ColumnResult(name = \"total\") }\n    )\n})","handlingStrategy":"validation","validationCode":"// reflectively check annotation usage at startup or in a test:\nfor ( SqlResultSetMapping m : mappings ) {\n    for ( ConstructorResult c : c.classes() ) {\n        if ( c.columns().length == 0 ) {\n            throw new IllegalStateException( \"ConstructorResult for \" + c.targetClass().getName() + \" has no columns\" );\n        }\n    }\n}","typeGuard":"static boolean hasColumns(ConstructorResult c) {\n    return c.columns() != null && c.columns().length > 0;\n}","tryCatchPattern":"catch ( IllegalArgumentException e ) {\n    if ( \"ConstructorResult did not define any ColumnResults\".equals( e.getMessage() ) ) {\n        // add @ColumnResult entries matching the target constructor's parameters\n    }\n}","preventionTips":["Write @ConstructorResult from the constructor signature outward: one @ColumnResult per parameter, in order.","Keep a small unit test that builds the EntityManagerFactory for annotated entities so empty annotations fail in CI."],"tags":["hibernate","jpa","sql-result-set-mapping","constructor-result","annotations"],"backgroundTag":"empty-constructor-result","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}