使用Spring Data Jpa来操作数据库的,可是在更新数据的时候发现一个问题,属性值为Null竟然也更新,这就会导致本来没有更新的属性值,全部就成了Null。
实体如下:
package com.sgcc.modules.system.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.sgcc.base.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@Entity
@Getter
@Setter
@Table(name = "sys_evaluation_preserve")
public class EvaluationPreserve extends BaseEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@ApiModelProperty(value = "id")
private Long id;
@Column(name = "assessor_id")
private String assessorId;
@Column(name = "assessor_name")
private String assessorName;
@Column(name = "assessor_branch_id")
private Long assessorBranchId;
@Column(name = "assessor_branch_name")
private String assessorBranchName;
@Column(name = "assessor_job_id")
private Long assessorJobId;
@Column(name = "assessor_job_name")
private String assessorJobName;
}
方案如下:
说明:
- 目标源:请求更新的实体数据。
- 数据源:通过目标源传上来的id,去数据库中查出的实体数据
我们可以将目标源中需要改变的属性值过滤掉以后,将数据源中的数据复制到目标源中,这样就达到了,只是更新需要改变的属性值,不需要更新的保持不变。
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.Set;
public class UpdateTool {
/**
* 将目标源中不为空的字段过滤,将数据库中查出的数据源复制到提交的目标源中
*
* @param source 用id从数据库中查出来的数据源
* @param target 提交的实体,目标源
*/
public static void copyNullProperties(Object source, Object target) {
BeanUtils.copyProperties(source, target, getNoNullProperties(target));
}
/**
* @param target 目标源数据
* @return 将目标源中不为空的字段取出
*/
private static String[] getNoNullProperties(Object target) {
BeanWrapper srcBean = new BeanWrapperImpl(target);
PropertyDescriptor[] pds = srcBean.getPropertyDescriptors();
Set<String> noEmptyName = new HashSet<>();
for (PropertyDescriptor p : pds) {
Object value = srcBean.getPropertyValue(p.getName());
if (value != null) noEmptyName.add(p.getName());
}
String[] result = new String[noEmptyName.size()];
return noEmptyName.toArray(result);
}
}
EvaluationPreserve evaluationPreserve = new EvaluationPreserve();
evaluationPreserve.setId(evaPreInfoReq.getEvaPreIds().get(0));
evaluationPreserve.setAssessorName(evaPreInfoReq.getAssessorName());
evaluationPreserve.setAssessorJobId(evaPreInfoReq.getAssessorJobId());
evaluationPreserve.setAssessorJobName(evaPreInfoReq.getAssessorJobName());
evaluationPreserve.setAssessorBranchId(evaPreInfoReq.getAssessorBranchId());
evaluationPreserve.setAssessorBranchName(evaPreInfoReq.getAssessorBranchName());
EvaluationPreserve evaluationPreserveInfo = evalPreRepository.findById(evaPreInfoReq.getEvaPreIds().get(0)).orElse(new EvaluationPreserve());
UpdateTool.copyNullProperties(evaluationPreserveInfo,evaluationPreserve);
EvaluationPreserve save = evalPreRepository.save(evaluationPreserve);
if(save == null){
throw new MessageException(ExceptionEnum.UPDATE_OPERATION_FAIL);
}