{"record":{"id":"295fb7ee93004f2d","repo":"quarkusio/quarkus","slug":"method-of-repository-repository-contains-bot","errorCode":null,"errorMessage":"${method} of Repository ${repository} contains both a Sort parameter and a sort operation","messagePattern":"(.+?) of Repository (.+?) contains both a Sort parameter and a sort operation","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":182,"sourceCode":"                    params[i] = mc.parameter(\"p\" + i);\n                }\n\n                mc.body(bc -> {\n                    // Store static field and instance field in LocalVars so they can be reused\n                    LocalVar ops = bc.localVar(\"ops\", bc.getStaticField(operationsField));\n                    LocalVar entityClass = bc.localVar(\"entityClass\",\n                            bc.get(mc.this_().field(entityClassFieldDescriptor)));\n\n                    // Build params array for query parameters\n                    LocalVar paramsArray = bc.localVar(\"paramsArray\",\n                            bc.newEmptyArray(Object.class, parseResult.getParamCount()));\n                    for (int i = 0; i < queryParameterIndexes.size(); i++) {\n                        bc.set(paramsArray.elem(i), params[queryParameterIndexes.get(i)]);\n                    }\n\n                    if (parseResult.getQueryType() == MethodNameParser.QueryType.SELECT) {\n                        if (parseResult.getSort() != null && finalSortParameterIndex != null) {\n                            throw new IllegalArgumentException(\n                                    method.name() + \" of Repository \" + repositoryClassInfo + \" contains both a \"\n                                            + DotNames.SPRING_DATA_SORT + \" parameter and a sort operation\");\n                        }\n\n                        // ensure that Sort is correctly handled whether it's specified in the method name or via a Sort method param\n                        String finalQuery = parseResult.getQuery();\n                        Expr sort = Const.ofNull(ClassDesc.of(io.quarkus.panache.common.Sort.class.getName()));\n                        if (finalSortParameterIndex != null) {\n                            sort = bc.invokeStatic(\n                                    MethodDesc.of(TypesConverter.class, \"toPanacheSort\",\n                                            io.quarkus.panache.common.Sort.class,\n                                            org.springframework.data.domain.Sort.class),\n                                    params[finalSortParameterIndex]);\n                        } else if (parseResult.getSort() != null) {\n                            finalQuery += PanacheJpaUtil.toOrderBy(parseResult.getSort());\n                        } else if (finalPageableParameterIndex != null) {\n                            Expr pageable = params[finalPageableParameterIndex];\n                            Expr pageableSort = bc.invokeInterface(","sourceCodeStart":164,"sourceCodeEnd":200,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/spring-data-jpa/deployment/src/main/java/io/quarkus/spring/data/deployment/generate/DerivedMethodsAdder.java#L164-L200","documentation":"Quarkus's spring-data-jpa extension generates implementations for derived query methods at build time. When a derived SELECT method both embeds an 'OrderBy...' clause in its name AND declares an org.springframework.data.domain.Sort parameter, the sort order is ambiguous, so the extension fails the build with this IllegalArgumentException. Only one sort mechanism may be used per method.","triggerScenarios":"Declaring a repository method like List<Person> findByLastNameOrderByFirstNameAsc(String lastName, Sort sort) — i.e. MethodNameParser.QueryType.SELECT with parseResult.getSort() != null and a Sort parameter (finalSortParameterIndex != null) present at the same time.","commonSituations":"Incrementally adding paging to an existing repository: a method already named findByXOrderByYAsc gets a Sort argument appended for 'dynamic sorting'; copying Spring Data examples that allow this combination without realizing Quarkus's derived-method generation is stricter.","solutions":["Remove the OrderBy clause from the method name and rely on the Sort parameter: findByLastName(String lastName, Sort sort)","Or remove the Sort parameter and keep the name-based ordering: findByLastNameOrderByFirstNameAsc(String lastName)","If both static and dynamic ordering are truly needed, define two separate repository methods"],"exampleFix":"// before\nList<Person> findByLastNameOrderByFirstNameAsc(String lastName, Sort sort);\n\n// after\nList<Person> findByLastName(String lastName, Sort sort);","handlingStrategy":"validation","validationCode":"// At build/startup, scan repository interfaces for SELECT methods having both OrderBy in the name and a Sort param\nfor (Method m : PersonRepository.class.getMethods()) {\n    boolean nameSort = m.getName().contains(\"OrderBy\");\n    boolean paramSort = Arrays.stream(m.getParameterTypes()).anyMatch(Sort.class::isAssignableFrom);\n    if (nameSort && paramSort)\n        throw new IllegalStateException(\"Ambiguous sort in \" + m.getName());\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pick one sorting style per repository: either OrderBy-in-name or Sort parameters, and document it","Review derived method signatures during code review for combined sort mechanisms","Keep a repository convention file listing allowed derived-query patterns"],"tags":["spring-data","jpa","quarkus","derived-query","build-time"],"backgroundTag":"ambiguous-sort-definition","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}