我有以下表People
我想获取关系记录并使JSON数组如下:
{ "Person":[
{"ID":1,
"FirstName":"James",
"LastName":"Donovan",
"Child":[
{"ID":6, "FirstName":"Nikolai", "LastName":"Donovan"}
]
},
{"ID":2,
"FirstName":"Jeffrey",
"LastName":"Williams",
"Child":[
{"ID":4, "FirstName":"Carol", "LastName":"Williams"},
{"ID":5, "FirstName":"Sarah", "LastName":"Williams"}
]
},
.... and so on
]
}
我使用以下方法; 以下代码的简短摘要:我在循环中执行两次db操作并将节点放入JSON对象符合某些条件。
preparedStatement = con.prepareStatement("SELECT * FROM PEOPLE");
rs = preparedStatement.executeQuery(); // ResultSet Object
if (rs != null && rs.next()) {
Roles = new JSONObject();
parentNode = new JSONObject();
childNode = new JSONObject();
while(rs.next()) {
parentNode.put("ID", rs.getInt("Id"));
parentNode.put("FirstName", rs.getString("firstname"));
parentNode.put("LastName", rs.getString("lastname"));
if(rs.getInt("parent") > 0) { // Equal 0 Mean it has not child
// Perform again database operation and get record related to parent id
preparedStatement = con.prepareStatement("SELECT * FROM PEOPLE WHERE parent=?");
preparedStatement.setString(1, rs.getInt("id");
resultSet2 = preparedStatement.executeQuery();
while(resultSet2.next()) {
childNode.put("ID", rs.getInt("Id"));
childNode.put("FirstName", rs.getString("firstname"));
childNode.put("LastName", rs.getString("lastname"));
parentNode.put("Child":childRole); // put child into parent node
}
}
}
}
我想要什么? 对于服务器端,在循环中执行db select查询太昂贵。
是否有更好的解决方案可以生成所需的关系数据JSON,并使我免于额外的SELECT操作!
我很感谢你的关注!
答案 0 :(得分:0)
如果您使用的是mysql 5.7,则可以通过JSON_ARRAY函数创建json数组。或者JSON_OBJECT https://dev.mysql.com/doc/refman/5.7/en/json-attribute-functions.html
答案 1 :(得分:0)
可能会使用两个查询。
循环遍历第二个结果集的结果,并将它们分配给第一个结果集中的父级。
使用gson(或jackson或您喜欢的任何json库)将对象列表转换为最终的jason。
简短的代码类似的东西
select the parents (parent = 0).
for each parent row, add the row to a Map<String, Entity> where the key is the parent id.
select the children (parent != 0).
for each child row, get the parent row from the map using the parent id then add them to the parent entity.
对父行和子行使用相同的类,将子集初始化为null,并在第一次添加子项时创建它。这样,子数组将包含给有子女的父母,不包括没有子女和子女的父母。
答案 2 :(得分:-1)
您可以发出一个选择
SELECT p.ID, p.FirstName, p.LastName, c.ID, c.FirstName, c.LastName
FROM PEOPLE p LEFT OUTER JOIN PEOPLE c ON c.parent = p.ID
ORDER BY p.ID
然后遍历结果。 每当父ID更改(并且对于第一个结果行)时,您将构建新的当前parentNode。然后你读取子数据(如果父项没有子项,则可能为空)并将其放入当前parentNode的子json数组中。