Я пытаюсь экспортировать данные в csv из моего проекта springboot. Я использую простой критерий запроса и использую метод getResultStream, как показано ниже, но это занимает одну минуту, чтобы экспортировать только 1800 строк. Может кто-нибудь сообщить мне, что я делаю неправильно.
class SomeService{
public void searchProductMasterExportList(RequestClass request,HttpServletResponse response){
try(Stream<SomeModel> exportList = em.createQuery(query).getResultStream()){
PrintWriter out = response.getWriter();
exportList.forEach((todo -> createCsvLine(todo,out,em)
));
out.flush();
}
--- код createcsv ниже - он добавляет значения с разделителями. - изменил имя геттера на a, b, c, x, et c
private void createCsvLine(some parameters){
StringBuilder line = new StringBuilder();
line.append(null==productItemStreamData.x()?"":productItemStreamData.x()).append(",")
.append(null==x?"":x).append(",")
.append(null==productItemStreamData.getPlatform()?"":platformMap.get(productItemStreamData.y())).append(",")
.append(null==productItemStreamData.y()?"":productItemStreamData.getProductOwner()).append(",")
.append(null==productItemStreamData.getProductStatus()?"":productStatusMap.get(productItemStreamData.a())).append(",")
.append(null==productItemStreamData.a()?"":productItemStreamData.getDiscountPercentage()).append(",")
.append(null==productItemStreamData.b()?"":productItemStreamData.b()).append(",")
.append(null==productItemStreamData.c()?"":productItemStreamData.c()).append(",")
.append(null==productItemStreamData.getPriceStatus()?"":priceStatusMap.get(productItemStreamData.getPriceStatus())).append(",")
.append(null==productItemStreamData.getUnitOfMeasure()?"":productItemStreamData.getUnitOfMeasure()).append(",")
.append(null==productItemStreamData.d()?"":billingActionMap.get(productItemStreamData.d())).append(",")
.append(null==productItemStreamData.getFrequency()?"":frequencyMap.get(productItemStreamData.getFrequency())).append(",")
.append(null==productItemStreamData.getPriceType()?"":priceTypeMap.get(productItemStreamData.getPriceType())).append(",")
.append(null==productItemStreamData.getClientSegmentName()?"":clientSegmentMap.get(productItemStreamData.getClientSegmentName())).append(",")
.append(null==productItemStreamData.getPriceTierMin()?"":productItemStreamData.getPriceTierMin()).append(",")
.append(null==productItemStreamData.getPriceTierMax()?"":productItemStreamData.getPriceTierMax()).append(",")
.append(null==productItemStreamData.getListPrice()?"":productItemStreamData.getListPrice());
out.write(line.toString());
out.write("\n");
em.detach(productItemStreamData);
}
}
теперь контроллер похож на
@RequestMapping(value = "/v1/export", method = RequestMethod.POST)
public void exportProductItems(HttpServletResponse response,@RequestBody ProductItemsSearchRequest request,@RequestHeader (name="ctm-JWT") String jwtToken) throws Exception {
response.addHeader("Content-Type", "application/csv");
response.addHeader("Content-Disposition", "attachment; filename="+fileName);
response.setCharacterEncoding("UTF-8");
service.searchProductMasterExportList(request,response);
}