【问题标题】:GraphQL Spring-boot Query filteringGraphQL Spring-boot 查询过滤
【发布时间】:2018-08-29 07:09:27
【问题描述】:

我正在使用 GraphQL Spring-boot 库来构建 GraphQL API https://github.com/graphql-java/graphql-spring-boot

我有一个架构

type Car {
    id: ID!
    model: String
    brand: String
}

type Query {
    allCars: [Car]!
}

我的查询是在我的 Spring Boot 项目中的一个 Query 类中实现的

@Component
public class Query implements GraphQLQueryResolver {

public List<Machine> allCars() {}

}

我的问题是:

返回列表时如何使用过滤器和排序:

allCars(first:3){id model}

allCars(filter: {....}){}

我猜这是必须在 Java 方法中实现的东西,但我不确定如何在方法中注入过滤器等。

【问题讨论】:

  • 你有没有找到可以为每个模型自动生成过滤器的东西?

标签: java spring-boot graphql


【解决方案1】:

我的猜测是你会创建自己的过滤器输入类型,例如:

type Query {
    allCars(filter: CarsFilter!): [Car]
}


input CarsFilter {
    color: String!
    brand: String!
}

之后,可以编写CarsFilter的Java实现,例如:

public class CarsFilter {
    private String color;
    private String brand;

    // Getters + Setters
}

现在您可以使用 CarsFilter 类编写解析器:

public List<Car> allCars(CarsFilter filter) {
    // Filter by using JPA specifications, custom queries, ...
}

【讨论】:

  • 好的 - 这很有意义。我想知道是否有一些过滤和排序功能可以作为 GraphQL Java 库的一部分。因为我们可以从我们的“类型/模型”中限制返回参数
【解决方案2】:

GraphQL 允许客户端准确指定所需的数据,但它没有任何内置的数据过滤和排序方式。您将自己为此编写代码。关于注入过滤器,一种可能的方法如下:

type Query {
    allCars(filter: String, range: String, sort: String): [Car]!
}

对于上述查询,示例请求如下:

{
    allCars(filter: "{brand: 'Abc'}", range: "[0, 100]", sort: "[id, ASC]") { # Fetch first 100 cars of brand 'Abc' sorted by id
        id
        model
        brand
    }
}

那么您的 getAllCars 方法将如下所示:

public List<Car> getAllCars(String filter, String range, String sort) {
    // Implement parser and filter by using JPA specifications
}

要查看解析器的示例实现并将其转换为 JPA 规范,请参考以下项目:https://github.com/jaskaransingh156/spring-boot-graphql-with-custom-rql

【讨论】:

    猜你喜欢
    • 2019-12-29
    • 2020-01-25
    • 2020-03-08
    • 2018-08-04
    • 2018-05-31
    • 2016-04-17
    • 2016-07-26
    • 2019-04-24
    • 2018-08-02
    相关资源
    最近更新 更多