GraphQL如何支持AND-OR查询条件?

时间:2019-12-15 05:37:12

标签: graphql graphql-java

我是GraphQL的新手。要求从CUSTOMERS表中查询满足条件的所有合格数据:GENDER =='MALE'或'AGE'> =20。GQL应该看起来像什么?

2 个答案:

答案 0 :(得分:3)

有人在之前提出了similar thing,但实际上是rejected。这意味着GraphQL本身不支持它,您必须自己推出。

基于我所见的几种方法:

(1)定义自己的查询语言,例如stackoverflowShopify的作用:

type Query{
    customers (query:String) : [Customer]
}

查询变为:

{
  customers (query : "GENDER == 'MALE' or 'AGE' >= 20"){
    id
    name
  }
}

(2)定义自己的输入对象模型,以满足所有必需的搜索需求。Prisma尝试在OpenCRUD规范中定义一个。您可以参考一下这个想法。例如,您可以定义一个输入模型,例如:

input CustomerFilter {
     AND        :  [CustomerFilter]
     OR         :  [CustomerFilter]

    # Define the fields that you support to search
     gender     : String
     gender_not : String
     ....
     ....
     ...
     ...
     age        : Int
     age_gte    : Int
}

type Query{
    customers (filter:CustomerFilter) : [Customer]
}

查询变为:

{
  customers (filter : {
   OR: [
     { gender : 'MALE' } ,
     { age_gte: 20 }
    ]
  }){
    id
    name
  }
}

This是另一个可供参考的过滤器模型。这个想法是量身定制的,这样就足以处理您的所有应用程序需求,而又不会引入任何不必要的过滤复杂性。

此外,如果分页可能会返回许多数据,则很可能需要考虑分页。这意味着您必须为每个查询的输入参数添加偏移量和限制,以某种方式限制返回的记录数(如果您正在执行基于偏移量的分页)或查看Relay Specification(如果要在其中进行)基于光标的分页样式。

答案 1 :(得分:1)

您需要定义查询,架构和解析器。您的查询将类似于:

type Query {
    nameItAsPerUsecase: Customer
}

模式将如下所示:

type Customer{
 name : String
 age: Int
 .. add more fields as per as your need
}

您的解析器将如下所示:-

@Component
public class CustomerQuery implements GraphQLQueryResolver {

  @Autowired
  private CustomerRepository customerRepository ;

  public Customer getNameItAsPerUsecase() {

    return customerRepository.findByGenderAndAgeGreaterThanEqual(String gender, int age);
  }
}