3

postgresデータベースに次のレコードがあります。parent_pkは、親子関係のpkに関連付けられています。

pk名タイプparent_pk
--- ---- ---- ---------
1hnumber101家0
2hnumber201家0
101dodge_charger車両1
102マスタング車両1
103シビックビークル2
301ジョンユーザー101
302エドワードユーザー102
303ジョンユーザー102
304ジョンユーザー103

そして、私は次の形式で上記からjsonを生成したい-

[{
   "id":1、
   "名前": "hnumber101"、
   「タイプ」:「家」
   "子": [ {
              「id」:101、
              "名前": "ダッジチャージャー"、
              「タイプ」:「車両」
              "子": [{
                       「id」:301、
                       "名前": "ジョン"、
                       "タイプ":"ユーザー"
                       }]、                            
              }、
              {{
              「id」:102、
              「名前」:「ムスタング」、
              「タイプ」:「車両」
              "子": [{
                       「id」:303、
                       "名前": "ジョン"、
                       "タイプ":"ユーザー"
                       }、
                       {{
                       「id」:302、
                       "名前": "エドワード"、
                       "タイプ":"ユーザー"
                       }]、                            
              }]、
  }、
 {{
   "id":2、
   "名前": "hnumber201"、
   「タイプ」:「家」
   "子": [ {
              「id」:103、
              「名前」:「市民」、
              「タイプ」:「車両」
              "子": [{
                       "id":304、
                       "名前": "ジョン"、
                       "タイプ":"ユーザー"
                       }]、

              }]、
  }]

WITH RECURSIVEクエリを使用してみましたが、エントリのリストが生成され、親内にその子ブロックを取得するために、Javaコードで多くのループ/ハッシュマップを実行する必要があります。これを行うための最も効率的な方法は何でしょうか?

4

1 に答える 1

4

これらの行に沿ったもの:

SELECT things.pk, things.name, things.type, array_agg(sub.pk) AS children
FROM things
LEFT JOIN things sub ON sub.parent_pk = things.pk
GROUP BY things.pk, things.name, things.type;
ピーク | 名前 | タイプ | 子供  
---+---------------+---------+-----------
   1 | hnumber101 | 家 | 家 | {102,101}
 101 | ダッジチャージャー | 乗り物 | {301}
 102 | ムスタング | 乗り物 | {303,302}
 301 | ジョン | ユーザー | {ヌル}
 302 | エドワード | ユーザー | {ヌル}
 303 | ジョン | ユーザー | {ヌル}

pk をキーとする Map に行を収集しますMap<Integer, Thing>

class Thing {
  Integer id;
  String name;
  String type;
  Integer[] children;

  public String printMe(Map<Integer, Thing> allThings) {
    String ret = "... format json stuff here";
    for(Integer childId in children) {
      Thing child = allThings.get(childId);
      ret += child.printMe(allThings);
    }
    ret += "Format json stuff here";
    return ret;
  } 
};
于 2012-08-09T22:32:06.807 に答える