在實際的開發過程中,我們偶爾或者遇到過要導出列表中所有的數據。假設列表中有十萬條數據,那么導出所有,意味着要大批量的走查詢接口,通常我們的后台的API接口GET請求支持的查詢長度不得大於1000,(比如我根據一千個用戶id查詢用戶的真實姓名),那么GET請求顯然不太支持,解決辦法可以使用Post請求。當然如果不改的話其實也有笨方法。如果在實際開發過程中能幫助你解決問題實在是很高興。解決方法如下。
- 我們可以把接口請求GET 改為Post ,使用@RequestBody傳遞參數。
- 我們可以使用遞歸的方式進行分批查詢。也是解決的方法之一。具體實現如下
封裝了一個工具類
UserInfoManager
定義了一個常量 一次性查詢3000條
private final Double SEPARATE = 3000D;
public Map<String, UserInfoDto> getByUserIds(List<String> userIds) {
if (CollectionUtils.isEmpty(userIds)) {
return Maps.newHashMap();
}
if (userIds.size() <= SEPARATE) {
return getgUserMapByIds(userIds);
}
Map<String, UserInfoDto> all = new HashMap<>(16);
double x = Math.ceil(userIds.size() / SEPARATE);
int start = 0;
int end = 0;
for (int i = 0; i < x; i++) {
end = (int) ((i + 1) * SEPARATE);
end = end > userIds.size() ? userIds.size() : end;
all.putAll(getgUserMapByIds(userIds.subList(start, end)));
start = end;
}
return all;
}
public Map<String, DaPengUserResource> getgUserMapByIds(List<String> userIds) {
// 根據userIds查詢user微服務
List<UserInfoDto> userLists = userClient.getUserByIds(userIds);
if (!CollectionUtils.isEmpty(userLists )) {
return a.stream().collect(Collectors.toMap(UserInfoDto::getUserId, c -> c));
} else {
return Maps.newHashMap();
}
}