我正在使用spring数据JPA,我正在尝试使用JPARepository方法save((更新实体详细信息。我为更新实体而编写的代码在开发中运行良好,正如预期的那样。但是相同的代码在生产服务器上不起作用——它不会给出任何错误——只有在map((中编写的代码不起作用。下面是我的代码
public Long updateQrCodeUrlByBusinessDetails(Long businessId, String menuUrl, MENU_TYPE menuType) {
return qrCodeRepo.findByBusinessId(businessId).businessQrCode.stream().map(qr -> {
qr.setMenuUrl(menuUrl);
qr.setMenuType(menuType);
return qrCodeRepo.save(qr);
}).count();
}
问题是count
如果能够直接从流源计算计数,则可以选择不执行流管道(顺序或并行(。在这种情况下,不会遍历任何源元素,也不会评估任何中间操作。除了调试等无害情况外,强烈建议使用具有副作用的行为参数,这些参数可能会影响
在您的案例中正是这样。解决方案是根本不使用map
或count
,因为您不需要/使用它们来实现它们的预期用途,而是使用单个forEach
:
public void updateQrCodeUrlByBusinessDetails(Long businessId, String menuUrl, MENU_TYPE menuType) {
List<BusinessQRCode> businessQrCode = qrCodeRepo.findByBusinessId(businessId);
businessQrCode.stream().forEach(qr -> {
qr.setMenuUrl(menuUrl);
qr.setMenuType(menuType);
qrCodeRepo.save(qr);
});
}
请注意,您可以使用for循环做完全相同的事情,只需更少的调用、相同的线路数量,并且不必使用流:
public void updateQrCodeUrlByBusinessDetails(Long businessId, String menuUrl, MENU_TYPE menuType) {
List<BusinessQRCode> businessQrCode = qrCodeRepo.findByBusinessId(businessId);
for (BusinessQRCode qr : businessQrCode) {
qr.setMenuUrl(menuUrl);
qr.setMenuType(menuType);
qrCodeRepo.save(qr);
};
}
只有我的两分钱。
您应该始终从查询结果中返回Optional。您可以将其作为:
在存储库中:
Optional<List<BusinessQRCode>> findByBusinessId(Long businessId);
服务中:
public void updateQrCodeUrlByBusinessDetails(Long businessId, String menuUrl, MENU_TYPE menuType) {
// Fetch iterate, if exist
qrCodeRepo.findByBusinessId(businessId).ifPresent(qrCodes_ -> {
qrCodes_.forEach(code_-> {
qr.setMenuUrl(menuUrl);
qr.setMenuType(menuType);
});
qrCodeRepo.saveAll(qrCodes_);
});
当你返回相同的qr时,为什么要使用map。您可以跳过该部分,也可以跳过收集功能。我们已经有了qrCodes的列表,只需迭代它们并设置值,然后一次保存所有值。
在对代码进行一些更改后,它可以在开发和生产中按预期工作。我只是更改map()
中的对象值,然后返回使用Collectors.toList()
方法收集要列出的对象,然后再次使用forEach()
循环并更新实体数据。现在代码按预期工作。
public void updateQrCodeUrlByBusinessDetails(Long businessId, String menuUrl, MENU_TYPE menuType) {
List<BusinessQRCode> businessQrCode = qrCodeRepo.findByBusinessId(businessId);
businessQrCode.stream().map(qr -> {
qr.setMenuUrl(menuUrl);
qr.setMenuType(menuType);
return qr;
}).collect(Collectors.toList()).forEach(qr -> qrCodeRepo.save(qr));
}