JPA,save()方法更新部分字段,前端传入对象部分值为null覆盖解决方法
使用一个工具类import org.springframework.beans.BeanUtils;import org.springframework.beans.BeanWrapper;import org.springframework.beans.BeanWrapperImpl;import java.beans.PropertyDescriptor;import java.util.Ha
·
使用一个工具类
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.beans.PropertyDescriptor;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
/**
* 更新工具类(忽略为null的字段)
*/
public class UpdateUtil {
/**
* 所有为空值的属性都不copy
* @param source
* @param target
*/
public static void copyNullProperties(Object source, Object target) {
BeanUtils.copyProperties(source, target, getNullField(source));
}
/**
* 获取属性中为空的字段
*
* @param target
* @return
*/
private static String[] getNullField(Object target) {
BeanWrapper beanWrapper = new BeanWrapperImpl(target);
PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors();
Set<String> notNullFieldSet = new HashSet<>();
if (propertyDescriptors.length > 0) {
for (PropertyDescriptor p : propertyDescriptors) {
String name = p.getName();
Object value = beanWrapper.getPropertyValue(name);
if (Objects.isNull(value)) {
notNullFieldSet.add(name);
}
}
}
String[] notNullField = new String[notNullFieldSet.size()];
return notNullFieldSet.toArray(notNullField);
}
}
然后先使用findone 或者 findbyid先查,使用查到的数据覆盖掉null值即可
//新增and修改
@Transactional
public VegeGoods updateGoods(VegeGoods goods){
VegeGoods oldvegegoods=vegeGoodsRes.getOne(goods.getId());
if(StringUtils.isEmpty(oldvegegoods)){
return vegeGoodsRes.save(goods);
}else{
UpdateUtil.copyNullProperties(goods,oldvegegoods);
return vegeGoodsRes.save(oldvegegoods);
}
}
更多推荐
所有评论(0)