{"record":{"id":"a71bf27ca825d088","repo":"hibernate/hibernate-orm","slug":"cannot-specify-both-result-set-mapping-names-and-c","errorCode":null,"errorMessage":"Cannot specify both result-set mapping names and classes","messagePattern":"Cannot specify both result-set mapping names and classes","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/procedure/internal/Util.java","lineNumber":37,"sourceCode":" * Utilities used to implement procedure call support.\n *\n * @author Steve Ebersole\n */\npublic class Util {\n\n\tprivate Util() {\n\t}\n\n\tpublic static List<ResultSetMapping> resolveResultSetMappings(\n\t\t\tString procedureName,\n\t\t\tString[] resultSetMappingNames,\n\t\t\tClass<?>[] resultSetMappingClasses,\n\t\t\tConsumer<String> querySpaceConsumer,\n\t\t\tResultSetMappingResolutionContext context) {\n\t\tif ( !isEmpty( resultSetMappingNames ) ) {\n\t\t\t// cannot specify both\n\t\t\tif ( !isEmpty( resultSetMappingClasses ) ) {\n\t\t\t\tthrow new IllegalArgumentException( \"Cannot specify both result-set mapping names and classes\" );\n\t\t\t}\n\t\t\treturn resolveResultSetMappings( procedureName, resultSetMappingNames, querySpaceConsumer, context );\n\t\t}\n\t\telse if ( !isEmpty( resultSetMappingClasses ) ) {\n\t\t\treturn resolveResultSetMappings( procedureName, resultSetMappingClasses, querySpaceConsumer, context );\n\t\t}\n\t\telse {\n\t\t\treturn List.of( resolveResultSetMapping( procedureName, true, context.getSessionFactory() ) );\n\t\t}\n\t}\n\n\tpublic static void resolveResultSetMappings(\n\t\t\tString[] resultSetMappingNames,\n\t\t\tClass<?>[] resultSetMappingClasses,\n\t\t\tResultSetMapping resultSetMapping,\n\t\t\tConsumer<String> querySpaceConsumer,\n\t\t\tResultSetMappingResolutionContext context) {\n\t\tif ( !isEmpty( resultSetMappingNames ) ) {","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/procedure/internal/Util.java#L19-L55","documentation":"Util.resolveResultSetMappings(String[],String[],...) refuses ambiguity: if both resultSetMappingNames and resultSetMappingClasses arrays are non-empty it throws IllegalArgumentException, because Hibernate cannot apply two mapping strategies to one call. These arrays come from the resultClasses / resultSetMappings attributes of @NamedStoredProcedureQuery (ProcedureCallHints) or from how the call was created.","triggerScenarios":"@NamedStoredProcedureQuery(name = \"loadOrder\", procedureName = \"load_order\", resultClasses = { Order.class }, resultSetMappings = { \"orderMapping\" }) — both attributes populated; or building ProcedureCallHints with both arrays set.","commonSituations":"Copy-pasting annotation fragments from two different examples; adding resultSetMappings and forgetting to remove resultClasses; refactoring from class-based mappings to named mappings without cleaning the annotation.","solutions":["Keep exactly one of resultClasses or resultSetMappings on the annotation / hints","If a mix of entity and scalar results is needed, encode both inside a single @SqlResultSetMapping (@EntityResult plus @ColumnResult) and reference it by name","Add a bootstrap test that instantiates every @NamedStoredProcedureQuery to catch this at build time"],"exampleFix":"// before\n@NamedStoredProcedureQuery(name = \"loadOrder\",\n    procedureName = \"load_order\",\n    resultClasses = { Order.class },\n    resultSetMappings = { \"orderMapping\" })\n\n// after\n@NamedStoredProcedureQuery(name = \"loadOrder\",\n    procedureName = \"load_order\",\n    resultSetMappings = { \"orderMapping\" })","handlingStrategy":"validation","validationCode":"if (resultSetMappingNames.length > 0 && resultSetMappingClasses.length > 0) {\n    throw new IllegalStateException(\"Configure either resultClasses or resultSetMappings, not both\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    ProcedureCall call = session.createNamedStoredProcedureCall(\"loadOrder\");\n} catch (IllegalArgumentException e) {\n    // both mapping styles configured on the named call: remove one attribute\n}","preventionTips":["Review every @NamedStoredProcedureQuery for simultaneous resultClasses and resultSetMappings","Express mixed entity/scalar shapes inside one @SqlResultSetMapping","Validate procedure annotations in a bootstrap test"],"tags":["hibernate","stored-procedure","result-mapping","jpa-annotation","configuration"],"backgroundTag":"conflicting-result-mapping-config","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}