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代码中进行很多循环/哈希映射,以在父级内部获得该子级块。什么是最有效的方法?
遵循以下原则:
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)
| 归档时间: |
|
| 查看次数: |
1957 次 |
| 最近记录: |