GraphQLJava:使用@Batched DataFetcher
我知道如何: 但是,具有嵌套列表的模式应该使用BatchedExecutionStrategy,并使用注释为@batched()的get()方法创建批处理数据获取程序 但是我应该把getData()调用放在哪里呢GraphQLJava:使用@Batched DataFetcher,graphql,graphql-java,Graphql,Graphql Java,我知道如何: 但是,具有嵌套列表的模式应该使用BatchedExecutionStrategy,并使用注释为@batched()的get()方法创建批处理数据获取程序 但是我应该把getData()调用放在哪里呢 ///// Where to put this code? List list = myService.getData(); ///// public class MyDataFetcher implements DataFetcher { @Batched public
///// 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?
}
}
警告:原来的
BatchedExecutionStrategy
已被弃用,将被删除。当前首选的解决方案是。此外,整个执行引擎将在未来被替换,新引擎将再次支持“本地”批处理。您已经可以使用and(都在nextgen
包中),但它们对指令插入的支持有限。下面的答案同样适用于legacy和nextgen执行引擎
像这样看。正常的DataFetchers
s接收单个对象作为源(DataFetchingEnvironment#getSource
),并作为结果返回单个对象。例如,如果您有如下查询:
{
user (name: "John") {
company {
revenue
}
}
您的公司
解析程序(取数器)将获取一个用户
对象作为源,并将以某种方式基于此返回一个公司
,例如
User owner = (User) environment.getSource();
Company company = companyService.findByOwner(owner);
return company;
现在,在完全相同的场景中,如果您的DataFetcher
是批处理的,并且您使用了BatchedExecutionStrategy
,而不是接收用户
并返回公司
,那么您将收到一个列表
,并返回一个列表
例如
List owner=(List)environment.getSource();
上市公司=companyService.findByOwners(所有者);
返回公司;
请注意,这意味着您的底层逻辑必须有一种同时获取多个内容的方法,否则它将不会被批处理。因此,您的myService.getData
调用需要更改,除非它已经可以一次性获取多个源对象的数据
还要注意,批处理解析仅在嵌套查询中有意义,因为顶级解析程序已经可以获取对象列表,而不需要批处理
User owner = (User) environment.getSource();
Company company = companyService.findByOwner(owner);
return company;
List<User> owners = (List<User>) environment.getSource();
List<Company> companies = companyService.findByOwners(owners);
return companies;