使用Jpa自带的Save方法更新实体类时,会覆盖数据库中实体类原有内容。如果我们只想更新一部分字段或是选择性的更新,就只能另辟蹊径了。这个工具类很好地弥补了这个不足,对于待更新实体类中有内容的字段会更新,为空的字段会采用原数据库中内容,下面是工具类代码(附使用方法)。
工具类代码:
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.util.HashSet;
import java.util.Set;
/**
* jpa 部分字段更新方法
*/
public class UpdateColumnUtil {
public static String[] getNullPropertyNames(Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<>();
for (java.beans.PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) emptyNames.add(pd.getName());
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
}
使用方法:
//首先从数据库查出待更新对象
Customer target = customerService.findById(customer.getCustId());
//使用更新对象的非空值去覆盖待更新对象
BeanUtils.copyProperties(customer, target, UpdateColumnUtil.getNullPropertyNames(customer));
//执行更新操作
save = customerService.save(target);
这样一个映射就完成我们的需求了。