4

我知道如何从 datafetcher 中的服务中检索 bean

public class MyDataFetcher implements DataFetcher {
  ...

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

但是具有嵌套列表的模式应该使用 BatchedExecutionStrategy 并使用带有注解 @Batched 的 get() 方法创建批处理 DataFetchers(请参阅 graphql-java 文档)。

但是我应该把我的 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?
  }
}
4

1 回答 1

5

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

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

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

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

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

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

例如

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

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

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

于 2017-05-27T09:03:23.447 回答