GraphQL Spring-boot 查询过滤
Posted
技术标签:
【中文标题】GraphQL Spring-boot 查询过滤【英文标题】:GraphQL Spring-boot Query filtering 【发布时间】: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 方法中实现的东西,但我不确定如何在方法中注入过滤器等。
【问题讨论】:
你有没有找到可以为每个模型自动生成过滤器的东西? 【参考方案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
【讨论】:
以上是关于GraphQL Spring-boot 查询过滤的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Sangria 中使用 graphql 查询过滤列表响应
使用 apollo-express 限制或过滤 graphql 查询