【问题标题】:GraphQL Java: Using @Batched DataFetcherGraphQL Java:使用@Batched DataFetcher
【发布时间】:2017-06-21 20:03:20
【问题描述】:

我知道怎么retrieve a bean from a service in a datafetcher:

public class MyDataFetcher implements DataFetcher {
  ...

  @Override
  public Object get(DataFetchingEnvironment environment) {
    return myService.getData();
  }
}

但是具有嵌套列表的架构应该使用 BatchedExecutionStrategy 并使用带有注解 @Batched (see graphql-java doc) 的 get() 方法创建批处理 DataFetchers。

但是我应该把我的 getData() 调用放在哪里呢?

///// Where to put this code?
List list = myService.getData();
/////

public class MyDataFetcher implements DataFetcher {

  @Batched
  public Object get(DataFetchingEnvironment environment) {
    return list.get(environment.getIndex()); // where to get the index?
  }
}

【问题讨论】:

    标签: graphql graphql-java


    【解决方案1】:

    警告:原来的BatchedExecutionStrategy 已被弃用并将被删除。当前首选的解决方案是Data Loader library。此外,整个执行引擎将在未来被替换,新的将再次支持“本机”批处理。您已经可以使用the new enginethe new BatchedExecutionStrategy(都在nextgen 包中),但它们对检测的支持有限。下面的答案同样适用于旧版和下一代执行引擎。

    这样看。正常DataFetcherss 接收单个对象作为源 (DataFetchingEnvironment#getSource) 并返回单个对象作为结果。例如,如果您有这样的查询:

    {
       user (name: "John") {
           company {
               revenue
           }
    }
    

    您的company 解析器(提取器)将获得一个User 对象作为源,并且预计会以某种方式返回一个基于该对象的Company,例如

    User owner = (User) environment.getSource();
    Company company = companyService.findByOwner(owner);
    return company;
    

    现在,在完全相同的场景中,如果您的 DataFetcher 被批处理,并且您使用 BatchedExecutionStrategy,而不是接收 User 并返回 Company,您将收到 List<User> 并且会而是返回 List<Company>

    例如

    List<User> owners = (List<User>) environment.getSource();
    List<Company> companies = companyService.findByOwners(owners);
    return companies;
    

    请注意,这意味着您的底层逻辑必须有一种方法可以一次获取多个内容,否则它不会被批处理。因此,您的 myService.getData 调用需要更改,除非它已经可以一次性获取多个源对象的数据。

    还请注意,批处理解析仅在嵌套查询中有意义,因为顶级解析器已经可以获取对象列表,而无需批处理。

    【讨论】:

      猜你喜欢
      • 2018-02-01
      • 2020-07-20
      • 2017-05-17
      • 2019-06-18
      • 2022-09-26
      • 2017-05-15
      • 2019-03-22
      • 2018-12-03
      • 2020-12-02
      相关资源
      最近更新 更多