我在我的一个应用程序中面临graphql WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[@name='InlineDialog1_Iframe or @id='InlineDialog1_Iframe']")));
问题,我在java中使用带有restful webservice的graphql。我使用n+1
和schemagen-graphql
连接到我的oracle db。
我看到了很多帖子,但大部分答案都是spring-data-jpa
实施。任何与java相关的东西都会很好。
答案 0 :(得分:10)
我对schemagen-graphql
了解不多,在这里是否重要,但总的来说,graphql-java
目前有3个选项:
DataFetcher
中)预取您需要的内容。您可以通过检查DataFetchingFieldSelectionSet
来预先确切地查看请求的子字段。
如果预取数据自然不适合结果对象,则可以将其存储在LocalContext
中,并在解析子字段值时使用它。在this blog post。@Batched
并使用BatchedExecutionStrategy
为您的数据提取程序添加注释。BatchedExecutionStrategy
绑定,并且在处理空值时不完全遵守规范。@Batched
DataFetcher#get
方法
DataFetchingEnvironment#getSource
将始终返回源对象列表(而不是一个)。List<Article> articles = DataFetchingEnvironment.getSource(); //source is a list List<Long> authorIds = articles.stream.map(article -> article.getAuthodId()).collect(Collectors.toList()); //fetch all the authors in one go `SELECT * FROM Author WHERE author_id IN (authorIds)`
DataLoader
获取您的数据,而不是直接获取数据。这个想法与原始数据加载器JavaScript库非常相似。仅适用于默认AsyncExecutionStrategy
和仅适用于查询(因此不要指望它适用于突变和订阅)。尽管使用起来比较困难,但这个选项已有详细记录,应该是首选。您可以在DataLoaderRegistry
中提供ExecutionInput
的实例,并且您通常希望在每个请求上重新创建数据加载器和注册表(如果批处理程序是无状态的,则可以共享它们) :
DataLoaderRegistry loaders = ...; //initialize your loaders, usually per request
graphQL.execute(ExecutionInput.newExecutionInput()
.query(operation)
.dataLoaderRegistry(loaders) //add the registry to input
.build());
然后在您的DataFetcher
中,您随时可以访问DataLoader
您需要通过DataFetchingEnvironment#getDataLoader(String dataLoaderName)
:
return env.getDataLoader("authors").load(article.getAuthorId());
作为旁注,您可能需要查看我自己的库,以便从Java GraphQL-SPQR生成GraphQL API。这是使用@Batched
的{{3}}。
对于DataLoader,逻辑与上面相同,您可以通过DataLoaderRegistry
注释进入@GraphQLEnvironment
:
@GrapgQLQuery
public CompletableFuture<Author> author(@GraphQLContext Article article, @GraphQLEnvironment ResolutionEnvironment env) {
return env.dataFetchingEnvironment.getDataLoader("authors").load(article.getAuthorId())
}
我可能还会添加一个专门的注释,例如@DataLoader("authors")
,用于直接注入加载器。