4

datafetcher のサービスから Beanを取得する方法を知っています。

public class MyDataFetcher implements DataFetcher {
  ...

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

ただし、ネストされたリストを持つスキーマでは、BatchedExecutionStrategy を使用し、@Batched アノテーションが付けられた get() メソッドでバッチ化された DataFetchers を作成する必要があります ( 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?
  }
}
4

1 に答える 1

5

警告:オリジナルBatchedExecutionStrategyは推奨されておらず、削除されます。現在推奨されているソリューションは、Data Loader ライブラリです。また、実行エンジン全体が将来的に置き換えられ、新しいものは再びバッチ処理を「ネイティブに」サポートします。新しいエンジン新しいBatchedExecutionStrategyエンジン(両方ともnextgenパッケージ内)は既に使用できますが、インストルメンテーションのサポートは制限されています。以下の回答は、従来の実行エンジンと次世代の実行エンジンの両方に等しく当てはまります。

このように見てください。通常DataFetchersの s は、ソース ( DataFetchingEnvironment#getSource) として単一のオブジェクトを受け取り、結果として単一のオブジェクトを返します。たとえば、次のようなクエリがあるとします。

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

あなたのcompanyリゾルバー(フェッチャー)はオブジェクトをソースとして取得し、それに基づいUserて何とか返すことが期待されます。Company

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

さて、まったく同じシナリオで、DataFetcherがバッチ処理され、 を受け取ってを返すBatchedExecutionStrategy代わりに を使用した場合、 を受け取って代わりにを返します。UserCompanyList<User>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 に答える