{"record":{"id":"811d32f6aaa7c485","repo":"quarkusio/quarkus","slug":"method-method-of-repository-repository-has-in-811d32","errorCode":null,"errorMessage":"Method ${method} of Repository ${repository}has invalid parameters - only a single dynamic projection parameter of type Class can be specified","messagePattern":"Method (.+?) of Repository (.+?)has invalid parameters - only a single dynamic projection parameter of type Class can be specified","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/spring-data-jpa/deployment/src/main/java/io/quarkus/spring/data/deployment/generate/DerivedMethodsAdder.java","lineNumber":129,"sourceCode":"                parameterTypesStr[i] = parameterType.toString();\n                if (DotNames.SPRING_DATA_PAGEABLE.equals(parameterType)\n                        || DotNames.SPRING_DATA_PAGE_REQUEST.equals(parameterType)) {\n                    if (pageableParameterIndex != null) {\n                        throw new IllegalArgumentException(\"Method \" + method.name() + \" of Repository \" + repositoryClassInfo\n                                + \"has invalid parameters - only a single parameter of type\" + DotNames.SPRING_DATA_PAGEABLE\n                                + \" can be specified\");\n                    }\n                    pageableParameterIndex = i;\n                } else if (DotNames.SPRING_DATA_SORT.equals(parameterType)) {\n                    if (sortParameterIndex != null) {\n                        throw new IllegalArgumentException(\"Method \" + method.name() + \" of Repository \" + repositoryClassInfo\n                                + \"has invalid parameters - only a single parameter of type\" + DotNames.SPRING_DATA_SORT\n                                + \" can be specified\");\n                    }\n                    sortParameterIndex = i;\n                } else if (isDynamicProjectionParameter(paramType, method)) {\n                    if (dynamicProjectionParameterIndex != null) {\n                        throw new IllegalArgumentException(\"Method \" + method.name() + \" of Repository \" + repositoryClassInfo\n                                + \"has invalid parameters - only a single dynamic projection parameter of type \"\n                                + DotNames.CLASS + \" can be specified\");\n                    }\n                    dynamicProjectionParameterIndex = i;\n                } else {\n                    queryParameterIndexes.add(i);\n                }\n            }\n\n            MethodNameParser.Result parseResult = methodNameParser.parse(method);\n            if (parseResult.getParamCount() != queryParameterIndexes.size()) {\n                throw new IllegalArgumentException(\"The number of parameters of method \" + method.name() + \" of Repository \"\n                        + repositoryClassInfo\n                        + \" does not match the number of parameter needed (inferred from the method name)\");\n            }\n\n            // Need effectively final copies for use in lambdas\n            final Integer finalPageableParameterIndex = pageableParameterIndex;","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/spring-data-jpa/deployment/src/main/java/io/quarkus/spring/data/deployment/generate/DerivedMethodsAdder.java#L111-L147","documentation":"Dynamic projections are supported via a single parameter of type Class<T> at the end of a derived method. If a method declares two or more such Class parameters, DerivedMethodsAdder.add throws this error at build time because only one dynamic projection target can be bound to the generated query.","triggerScenarios":"Declaring e.g. <T> List<T> findByName(String n, Class<T> type1, Class<T> type2); the second Class parameter detected by isDynamicProjectionParameter triggers the throw.","commonSituations":"Trying to project to multiple shapes at once; copy-paste of a projection method then adding another Class param; misunderstanding that each Class param maps to a different view.","solutions":["Keep a single Class<T> parameter and select the projection per call","Remove the redundant Class parameter and define separate derived methods per projection type","Return entities and map to different DTOs in service code","Use fixed return types (entity or one interface projection) instead of dynamic projection if only one shape is ever needed"],"exampleFix":"// before\n<T, U> List<T> findByName(String n, Class<T> view1, Class<U> view2);\n\n// after\n<T> List<T> findByName(String n, Class<T> view);","handlingStrategy":"validation","validationCode":"long projCount = Arrays.stream(m.getParameterTypes())\n    .filter(t -> t == Class.class).count();","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Single Class<T> projection parameter only","Define one method per projection shape","Map to additional DTOs in the service layer"],"tags":["quarkus","spring-data-jpa","build-time","dynamic-projection","method-signature"],"backgroundTag":"invalid-repository-method-signature","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}