2016-07-30 11 views
1

2つのMysqlテーブルで表される階層から応答としてJSONオブジェクトを返すためにSpringを使用しています。Javaを使用してJSONオブジェクトにmysql階層を取得するときに重複したノード

------------ -----------------  
| Concepts | | Relationships | 
|----------| |---------------| 
| id  | | relation_id | 
| title | | concept_id_1 | 
------------ | concept_id_2 | 
       ----------------- 

私はconceptのすべての子を返すメソッドgetChildrenを持ってこれを行うために。

私は、以下のようにこれらのメソッドを使用して、mysqlから階層構造を取得しています。


public String getPath(Concept concept, Set<Concept> children){ 
    if (children.size() > 0){ 

     Set<Concept> newNodes = new HashSet<>(); 
     ArrayList<String> returnedStrings = new ArrayList<>(); 
     String currentString = getChildrenString(concept, children); 
     return currentString; 
    } 
    return getMainString(concept, ""); 
} 

public String getChildrenString(Concept concept, Set<Concept> children){ 
    ArrayList<String> returnedStrings = new ArrayList<>(); 
    for (Concept node : children){ 
     String currentString = "{'id':" + concept.getId() + "," 
           + "'title':'" + concept.getDescription() + "'," 
           + "'nodes':[" + getPath(node, getChildrens(node)) + "]}"; 
     returnedStrings.add(currentString); 
    } 
    StringBuilder fullList = new StringBuilder(); 
    for (String s: returnedStrings){ 
     fullList.append(s+""); 
    } 
    return fullList.toString(); 
} 

public String getEmptyString(Concept concept){ 

    return "{'id':"+ concept.getId() + "," 
      + "'title':'" + concept.getDescription() + "'," 
      + "'nodes': []}"; 
} 

それはすべての既知の概念から、ここから始まります。

String test = getPath(concept, children); 

私は特定の概念のために期待してい正しい応答は次のようにされています。しかし、このコードは、ノードが重複している次の文字列を返して

{ 
    'id': 160000, 
    'title': 'root', 
    'nodes': [{ 
     'id': 160039, 
     'title': 'Therapeutic Uses', 
     'nodes': [{ 
      'id': 160001, 
      'title': 'Anti-Allergic Agents', 
      'nodes': [] 
     }, { 
      'id': 160002, 
      'title': 'Anti-Infective Agents', 
      'nodes': [{ 
       'id': 160004, 
       'title': 'Anti-Infective Agents, Local', 
       'nodes': [{ 
        'id': 160015, 
        'title': 'Hands Sanitizers', 
        'nodes': [] 
       }] 
      }] 
     }] 
    }] 
} 

、と私は理由を理解することはできませんこれは起こっているか、再帰のどの部分がこの問題を引き起こしているかです。

という概念がこのコードから返された回答で繰り返されています。

{ 
    'id': 160000, 
    'title': 'root', 
    'nodes': [{ 
     'id': 160039, 
     'title': 'Therapeutic Uses', 
     'nodes': [{ 
      'id': 160001, 
      'title': 'Anti-Allergic Agents', 
      'nodes': [] 
     }] 
    }, { 
     'id': 160039, 
     'title': 'Therapeutic Uses', 
     'nodes': [{ 
      'id': 160002, 
      'title': 'Anti-Infective Agents', 
      'nodes': [{ 
       'id': 160004, 
       'title': 'Anti-Infective Agents, Local', 
       'nodes': [{ 
        'id': 160015, 
        'title': 'Hands Sanitizers', 
        'nodes': [] 
       }] 
      }] 
     }] 
    }] 
} 

私のコードでこの原因が考えられますが、どうすれば正しい応答を得ることができますか?

答えて

0

この質問を書いた後、私はそれぞれ父親ノードの完全な文字列を返していたことに気づいたので、繰り返していたのです。

ノードの他のすべての子文字列を取得した後にこのメソッドを変更して文字列を返すと、正しい答えが得られます。

public String getChildrenString(Concept concept, Set<Concept> children){ 
    ArrayList<String> returnedStrings = new ArrayList<>(); 

    for (Concept node : children){ 
     String nodeString = getPath(node, hierarchy.getChildrens(node), entity, hierarchy); 
     returnedStrings.add(nodeString); 
    } 


    StringBuilder fullList = new StringBuilder(); 
    for (String s: returnedStrings){ 
     fullList.append(s+""); 
    } 
    return "{'id':" + concept.getId() + "," 
      + "'title':'" + concept.getDescription() + "'," + 
      "'nodes':[" + fullList.toString() + "]}"; 
} 
関連する問題