いくつかのバリエーションを試してみましたが、GraphQL でマップを返すことができませんでした。そのため、次の 2 つのオブジェクトがあります。
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 にはマップ型がありません。主な理由は、マップが動的な構造を持つデータであり、GraphQL が期待する静的型にうまく変換されないためです。それでも、いくつかのオプションがあります。
値の型を変更してキーを含め、マップをあきらめて代わりにリストを使用することもできます。これは、あなた自身の回答で採用したアプローチです。すでに例示されているので、ここでは詳しく説明しません。
キーと値の Java 型がわかっている限り ( などではない
Object
)、マップをキーと値のペアのリストとして扱うことができます。ペアを表す型を作成できます。タイプ Person { type: String! customers: [CustomerEntry!] }
CustomerEntry 型 { キー: String! 値: Customer! }
欠点としては、クエリが醜くなることです。
{
person {
type
customers {
key
value {
name
}
}
}
}
良い面としては、型の安全性と (ほとんど) セマンティクスが維持されます。 このアプローチをネストし続けることで、たとえば を表すことができますMap<String, Map<Long, Customer>>
。
- 完全に未知の型、つまり がある場合
Object
、唯一の選択肢はそれを複素スカラーとして扱うことです。JavaScriptでは、このアプローチは次のように知られています。JSON スカラー任意のJSON構造を詰め込んでスカラーとして扱うだけなので、同じアプローチをJavaで実装できます。graphql-javaには現在、拡張スカラー. これが彼らのオブジェクトスカラー(別名Jsonスカラー) 実装。
ここで、 のような型を表す場合はMap<String, Object>
、値の型のみを JSON スカラーとして上記のキーと値のペアのアプローチを使用して表すことも、マップ全体を JSON スカラーとして表すこともできます。
実際のところ、あなたは代表することを決めることができますどれでも(実際には任意の型ですが、これは役に立ちません) を JSON スカラーとしてマップします。
type MapEntry {
key: String!
value: [ObjectScalar!]
}
scalar ObjectScalar
利点としては、動的構造の形状を正確に維持できるようになりました。欠点としては、スカラーであるため、サブ選択を行うことができず、事前に内部の内容がわからないまますべてを取得することになります。