3

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

pk 名称类型 parent_pk
--- ---- ---- ---------
1 hnumber101 房子 0
2 hnumber201 房子 0
101 dodge_charger 车辆 1
102野马车1
103 民用车 2
301约翰用户101
302 爱德华用户 102
303 约翰用户 102
304 约翰用户 103

我想从上面生成一个json,格式如下-

[ {
   “身份证”:1,
   “名称”:“hnumber101”,
   “类型”:“房子”
   “孩子”: [ {
              “身份证”:101,
              "name": "道奇充电器",
              “类型”:“车辆”
              “孩子”: [{
                       “身份证”:301,
                       “姓名”:“约翰”,
                       “类型”:“用户”
                       }],                            
              },
              {
              “身份证”:102,
              “名称”:“野马”,
              “类型”:“车辆”
              “孩子”: [{
                       “身份证”:303,
                       “姓名”:“约翰”,
                       “类型”:“用户”
                       },
                       {
                       “身份证”:302,
                       “姓名”:“爱德华”,
                       “类型”:“用户”
                       }],                            
              }],
  },
 {
   “身份证”:2,
   “名称”:“hnumber201”,
   “类型”:“房子”
   “孩子”: [ {
              “身份证”:103,
              “名称”:“公民”,
              “类型”:“车辆”
              “孩子”: [{
                       “身份证”: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;
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;
  } 
};
于 2012-08-09T22:32:06.807 回答