Postgres / JSON-将父子关系转换为JSON

Har*_*eet 3 java postgresql json self-join recursive-query

我在postgres数据库中有以下记录。parent_pk与父子关系中的pk相关。

pk名称类型parent_pk
------ ---- ---------
1 hnumber101房子0
2 hnumber201房子0
101道奇充电车1
102野马车1
103公车2
301约翰使用者101
302爱德华用户102
303约翰用户102
304约翰用户103

我想以以下格式从上述内容中生成一个json-

[{
   “ id”:1
   “ name”:“ hnumber101”,
   “类型”:“房屋”
   “孩子”:[{
              “ id”:101,
              “ name”:“道奇充电器”,
              “ type”:“车辆”
              “孩子”:[{
                       “ id”:301,
                       “ name”:“ john”,
                       “ type”:“用户”
                       }],                            
              },
              {
              “ id”:102,
              “ name”:“ mustang”,
              “ type”:“车辆”
              “孩子”:[{
                       “ id”:303,
                       “ name”:“ john”,
                       “ type”:“用户”
                       },
                       {
                       “ id”:302,
                       “ name”:“ edward”,
                       “ type”:“用户”
                       }],                            
              }],
  },
 {
   “ id”:2
   “ name”:“ hnumber201”,
   “类型”:“房屋”
   “孩子”:[{
              “ id”:103,
              “ name”:“公民”,
              “ type”:“车辆”
              “孩子”:[{
                       “ id”:304,
                       “ name”:“ john”,
                       “ type”:“用户”
                       }],

              }],
  }]

我已经尝试过使用WITH RECURSIVE查询,但这会产生条目列表,然后我必须在我的Java代码中进行很多循环/哈希映射,以在父级内部获得该子级块。什么是最有效的方法?

jkj*_*jkj 5

遵循以下原则:

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;
Run Code Online (Sandbox Code Playgroud)
pk | 名称| 类型 孩子们  
----- + --------------- + --------- + -----------
   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;
  } 
};
Run Code Online (Sandbox Code Playgroud)