2017-12-06 15 views
0

私はいくつかの変種を試してみましたが、GraphQLでマップを返すことはできませんでした。だから私は、次の2つのオブジェクトがあります。Return HashMap <String、Object> from GraphQL-Java

public class Customer { 

    private String name, age; 
    // getters & setters 
} 

public class Person { 

    private String type; 
    private Map<String, Customer> customers; 
    // getters & setters 
} 

を私のスキーマは次のようになります。

type Customer { 
    name: String! 
    age: String! 
} 

type Person { 
    type: String! 
    customers: [Customer!] // Here I tried all combination but had no luck, is there a Map type support for GQL? 
} 

誰かがどのようにGraphQLが魔法の本や別のアプローチを処理するようにこれを達成するために教えてくださいことができます。

多くの感謝!

答えて

1

GraphQLにはマップタイプがありません(Discussion on GitHub)。

代替アプローチはCustomerCustomerクラス内の

public class Person { 
    private String type; 
    private List<Customer> customers; 
} 

Listとしてcustomersを有することで、マップのキーを含むであろう

public class Customer { 
    private String key; // or another meaningful name 
    private String name, age; 
} 

スキーマはほとんど同じままです。

type Customer { 
    key: String! // or another meaningful name 
    name: String! 
    age: String! 
} 

type Person { 
    type: String! 
    customers: [Customer!]! 
} 
0

あなた自身が述べたように、マップのような基本的に型指定されていないデータ(またはデータの動的構造を持つ)とは、あるGraphQLが期待静的な型にも翻訳しない主な理由は、GraphQLにはマップタイプありません。それでも、あなたはいくつかの選択肢があります。

1)キーを含むように値の種類を変更し、マップをあきらめて代わりにリストを使用することができます。これは自分の答えで取ったアプローチです。すでに例を示しているので、ここでは詳しく説明しません。

2)キーと値のJavaの型がわかっている場合(例:Objectではなく)、マップをキーと値のペアのリストとして扱うことができます。あなたがペア表現するために型を作成することができます:あなたは型の安全性と(ほとんど)セマンティクスを維持し、アップ側

{ 
    person { 
    type 
    customers { 
     key 
     value { 
     name 
     } 
    } 
    } 
} 

type Person { 
    type: String! 
    customers: [CustomerEntry!] 
} 

type CustomerEntry { 
    key: String! 
    value: Customer! 
} 

下側を、あなたは今醜いクエリを持っています。このアプローチをネストすることは可能である。 Map<String, Map<Long, Customer>>を表します。

3)全く知られていないタイプ、つまりObjectがある場合は、唯一の選択肢は複合スカラーとして扱うことです。 JavaScriptでは、このアプローチはJSON scalarとして知られています。これは、任意のJSON構造を詰め込み、スカラーとして扱うことになります。同じアプローチをJavaで実装することができます。ここにはGraphQL-SPQR's object scalar implementationがあります。

Map<String, Object>のような型を表現したい場合は、値の型だけをJSONスカラーにして、キー/値のペアのアプローチを使用するか、マップ全体を表現することができますJSONスカラーとして。

実際にはマップ(実際にはどのタイプでも有用ではありません)をJSONスカラーとして表現することができます。

type MapEntry { 
    key: String! 
    value: [ObjectScalar!] 
} 

scalar ObjectScalar 

動的構造の形状を正確に保持できるようになりました。 欠点は、スカラーなので、サブ選択を行うことは不可能であり、事前に内部のことを知らずに、すべてを取得することができます。

関連する問題