gpt4 book ai didi

GraphQL Java : Using @Batched DataFetcher

转载 作者:行者123 更新时间:2023-12-02 18:10:20 25 4
gpt4 key购买 nike

我知道如何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 注释的 get() 方法创建批量 DataFetchers ( see graphql-java doc )。

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

最佳答案

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

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

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

您的company解析器( getter )将得到 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 call 需要更改,除非它已经可以一次性获取多个源对象的数据。

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

关于GraphQL Java : Using @Batched DataFetcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42041371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com