2017-12-06 17 views
0

나는 변종을 거의 사용하지 않았고 GraphQL에서지도를 반환 할 운이 없었습니다. 그래서 다음과 같은 두 가지 목적이 있습니다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).

다른 방법은 ListCustomer

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

의 같은 customers을 가지고하고

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

스키마가 대부분 동일하게 유지 할 것 Customer 클래스 내부의 맵의 키를 포함한다.

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

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

당신 자신이 언급 한 바와 같이,지도와 같은 기본적으로 지정되지 않은 데이터 (또는 데이터 동적 구조) 및,이다 GraphQL 기대 정적 유형으로 잘 번역하지 않는 주로 때문에, GraphQL에는지도 유형이 없습니다 . 그래도 몇 가지 옵션이 있습니다.

1) 키가 포함되도록 값 유형을 변경하고지도에서 포기하고 대신 목록을 사용할 수 있습니다. 이것은 당신이 당신 자신의 대답에서 취한 접근법입니다. 이미 설명했듯이 여기서 자세히 설명하지 않겠습니다.

2) 키 및 값 자바 유형을 알고있는 한 (예 : 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 

동적 구조의 모양을 정확하게 유지할 수 있습니다. 단점은 스칼라이므로 하위 선택을하는 것은 불가능하며 사전에 무엇이 들어 있는지 모른 채 모든 것을 가져 오는 것입니다.