SmallRye GraphQL(Quarkus)同名查询多参数实现问题
在Quarkus的SmallRye GraphQL中实现同名不同参数的查询
针对你遇到的同名查询仅第一个生效的问题,有两种可行的解决方案:
方案一:启用方法重载支持
SmallRye GraphQL默认禁用了同名查询的方法重载,只需在application.properties中添加配置开启支持:
smallrye.graphql.allow-overloaded-queries=true
开启后,GraphQL会根据参数的名称和类型自动匹配对应的方法,你的原有代码无需修改:
- 客户端传递
id参数时,调用getEmployeeById方法 - 客户端传递
deptId参数时,调用getEmployeeByDeptId方法
注意:确保两个查询的参数组合有明确区分,避免出现参数类型/名称重叠导致的匹配歧义。
方案二:合并为单个查询方法(推荐)
GraphQL的设计理念更倾向于用可选参数实现多条件过滤,而非方法重载。你可以把两个查询逻辑合并到一个方法中,根据传入的参数分支处理:
方式1:使用默认值处理空参数
@Query(value = "Employee") public List<Employee> getEmployees( @Name("id") @DefaultValue("[]") List<Integer> employeeIds, @Name("deptId") @DefaultValue("[]") List<String> deptIds ) { if (!employeeIds.isEmpty()) { return employeeProcess.getEmployeeById(employeeIds); } else if (!deptIds.isEmpty()) { return employeeProcess.getEmployeeByDeptId(deptIds); } // 无参数时返回所有员工,或根据业务需求抛出异常 return employeeProcess.getAllEmployees(); }
方式2:使用Optional处理可选参数
@Query(value = "Employee") public List<Employee> getEmployees( @Name("id") Optional<List<Integer>> employeeIds, @Name("deptId") Optional<List<String>> deptIds ) { if (employeeIds.isPresent() && !employeeIds.get().isEmpty()) { return employeeProcess.getEmployeeById(employeeIds.get()); } else if (deptIds.isPresent() && !deptIds.get().isEmpty()) { return employeeProcess.getEmployeeByDeptId(deptIds.get()); } return employeeProcess.getAllEmployees(); }
这种方式的优势是客户端可以灵活组合参数,同时避免了重载可能带来的维护成本和歧义问题,更符合GraphQL的最佳实践。
内容的提问来源于stack exchange,提问作者Harish K
相关产品推荐
相关产品推荐

