{"record":{"id":"abe6c6819c7b9121","repo":"quarkusio/quarkus","slug":"method-method-name-of-repository-repository-abe6c6","errorCode":null,"errorMessage":"Method ${method.name()} of Repository ${repositoryClassInfo}has invalid parameters - only a single parameter of type${DotNames.SPRING_DATA_SORT} can be specified","messagePattern":"Method (.+?) of Repository (.+?)has invalid parameters - only a single parameter of type(.+?) 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/CustomQueryMethodsAdder.java","lineNumber":135,"sourceCode":"            List<Type> methodParameterTypes = method.parameterTypes();\n            String[] methodParameterTypesStr = new String[methodParameterTypes.size()];\n            List<Integer> queryParameterIndexes = new ArrayList<>(methodParameterTypes.size());\n            Integer pageableParameterIndex = null;\n            Integer sortParameterIndex = null;\n            for (int i = 0; i < methodParameterTypes.size(); i++) {\n                DotName parameterType = methodParameterTypes.get(i).name();\n                methodParameterTypesStr[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 {\n                    queryParameterIndexes.add(i);\n                }\n            }\n\n            // go through the method annotations, find the @Param annotation on parameters\n            // and map the name to the method param index\n            Map<String, Integer> namedParameterToIndex = new HashMap<>();\n            for (AnnotationInstance annotation : method.annotations(DotNames.SPRING_DATA_PARAM)) {\n                var index = (int) annotation.target().asMethodParameter().position();\n                namedParameterToIndex.put(annotation.value().asString(), index);\n            }\n            // if no or only some parameters are annotated with @Param, add the compiled names (if present)\n            if (namedParameterToIndex.size() < methodParameterTypes.size()) {","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/spring-data-jpa/deployment/src/main/java/io/quarkus/spring/data/deployment/generate/CustomQueryMethodsAdder.java#L117-L153","documentation":"Similar to the Pageable restriction: a custom @Query method can declare at most one Sort parameter. Two Sort parameters make ordering binding ambiguous, and the augmentation step rejects the method with this IllegalArgumentException.","triggerScenarios":"Declaring a repository method with two parameters of type org.springframework.data.domain.Sort, e.g. findByX(Sort primary, Sort secondary) or combining a redundant sort alongside another Sort.","commonSituations":"Trying to express multi-column ordering by passing two Sort objects (Spring merges them into one Sort anyway); copy-paste errors in method signatures; refactoring a method that already had Sort and adding another one.","solutions":["Use a single Sort parameter and chain multiple orders with Sort.by(Order.desc(\"a\"), Order.asc(\"b\"))","Remove the redundant Sort parameter","If two independent sort needs exist, define two separate repository methods","Embed fixed ordering directly into the JPQL (ORDER BY) and keep only dynamic sorting in one Sort parameter"],"exampleFix":"// before\nList<User> findUsers(Sort primarySort, Sort secondarySort);\n// after\nList<User> findUsers(Sort sort);\n// caller: Sort.by(Order.desc(\"created\"), Order.asc(\"name\"))","handlingStrategy":"validation","validationCode":"long sortCount = Arrays.stream(method.getParameterTypes())\n    .filter(t -> Sort.class.equals(t))\n    .count();\nif (sortCount > 1) throw new IllegalArgumentException(\"At most one Sort allowed\");","typeGuard":null,"tryCatchPattern":"try {\n    compile();\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"only a single parameter of type\")) {\n        log.error(\"Merge multiple Sort objects into one Sort.by(...)\");\n    }\n    throw e;\n}","preventionTips":["Use a single Sort parameter; combine orders with Sort.by(Order...)\n","Put fixed ordering in JPQL ORDER BY","Avoid passing two Sorts for multi-column ordering","Lint repository interfaces for duplicate Sort parameters"],"tags":["spring-data-jpa","quarkus","sorting","method-signature"],"backgroundTag":"duplicate-sort-parameter","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}