我有下表作为示例。它包含 5 个请求orderId,每个请求包含一定数量的操作,actionId其中显示请求的进度:
|ordr| data |
| -- | ----------------------------------------------------------------------------------------- |
| 1 | {"actionId":1,"curNum":1,"maxNum":3,"status":"READY","templateId":4,"errMsg":null} |
| 1 | {"actionId":1,"curNum":1,"maxNum":3,"status":"SUCCESS","templateId":4,"errMsg":null} |
| 1 | {"actionId":2,"curNum":2,"maxNum":3,"status":"READY","templateId":4,"errMsg":null} |
| 1 | {"actionId":2,"curNum":2,"maxNum":3,"status":"SUCCESS","templateId":4,"errMsg":null} |
| 1 | {"actionId":3,"curNum":3,"maxNum":3,"status":"READY","templateId":4,"errMsg":null} |
| 1 | {"actionId":3,"curNum":3,"maxNum":3,"status":"SUCCESS","templateId":4,"errMsg":null} |
| 2 | {"actionId":4,"curNum":1,"maxNum":3,"status":"READY","templateId":5,"errMsg":null} |
| 2 | {"actionId":4,"curNum":1,"maxNum":3,"status":"SUCCESS","templateId":5,"errMsg":null} |
| 2 | {"actionId":5,"curNum":2,"maxNum":3,"status":"READY","templateId":5,"errMsg":null} |
| 2 | {"actionId":5,"curNum":2,"maxNum":3,"status":"SUCCESS","templateId":5,"errMsg":null} |
| 2 | {"actionId":6,"curNum":3,"maxNum":3,"status":"READY","templateId":5,"errMsg":null} |
| 2 | {"actionId":6,"curNum":3,"maxNum":3,"status":"SUCCESS","templateId":5,"errMsg":null} |
| 3 | {"actionId":7,"curNum":1,"maxNum":2,"status":"READY","templateId":6,"errMsg":null} |
| 3 | {"actionId":7,"curNum":1,"maxNum":2,"status":"FAIL","templateId":6,"errMsg":"BAD REQUEST"}|
| 4 | {"actionId":8,"curNum":1,"maxNum":2,"status":"UNKNOWN","templateId":7,"errMsg":null} |
| 4 | {"actionId":8,"curNum":1,"maxNum":2,"status":"UNKNOWN","templateId":7,"errMsg":null} |
| 5 | {"actionId":7,"curNum":1,"maxNum":2,"status":"READY","templateId":6,"errMsg":null} |
| 5 | {"actionId":7,"curNum":1,"maxNum":2,"status":"FAIL","templateId":6,"errMsg":"BAD REQUEST"}|
如何使用 Stream Api 获取如下报告(为了清晰起见,显示在表中):
| TemplateId | TotalRunOrder |SuccessRunOrder | FailRunOrder |FailOrdersInfo |
| ---------- | -------------- | -------------- | --------------|----------------|
| 4 | 1 | 1 | 0 | null |
| 5 | 1 | 1 | 0 | null |
| 6 | 2 | 0 | 2 | [{"OrderId":3,"ErrMsg":"BAD REQUEST"},{"OrderId":5,"ErrMsg":"BAD REQUEST"}]|
| 7 | 0 | 0 | 0 | null |
报告字段如何计算的说明:
TemplateId- 从现场的初始表中获取dataTotalRunOrder- 如果其中OrderId至少有一种状态"READY"SuccessRunOrder- 我们在一个中寻找一行OrderId,curNum=maxNum如果状态在其中,"SUCCESS"那么我们认为申请成功FailRunOrder- 如果其中OrderId至少有一种状态,"FAIL"那么我们认为申请失败FailOrdersInfo- 以数组的形式显示信息,其中我们显示哪些OrderId失败并显示ErrMsg错误文本
在控制台中我们得到:
其余的可以类推。
首先,您需要在 field
data+ field中创建一些与 JSON 相对应的 POJO/DTO 类orderId:从表中读取数据并以任何方便的方式(如
JdbcTemplate+ )进行转换RowMapper,输出是集合/列表RowEntry:在第一遍中,构建了
Map<Integer, List<RowEntry>>带有键的映射templateId,在第二遍中,计算每个列表的相应统计信息RowEntry:Report仍然需要定义表示订单/行列表的聚合统计数据的类。以经典方式一次性计算输入参数的统计数据会更好/更高效: