【问题标题】:How does GraphQL support AND-OR query conditions?GraphQL 如何支持 AND-OR 查询条件?
【发布时间】:2019-12-15 15:08:49
【问题描述】:

我是 GraphQL 新手。要求从 CUSTOMERS 表中查询所有符合条件的数据,满足条件:GENDER == 'MALE' or 'AGE' >= 20。GQL 应该是什么样的?

【问题讨论】:

    标签: graphql graphql-java


    【解决方案1】:

    之前有人提出了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 - 基于分页样式。

    【讨论】:

      【解决方案2】:

      您需要定义查询、模式和解析器。您的查询将类似于:

      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);
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-09
        • 2023-03-27
        相关资源
        最近更新 更多