Spring Data Jpa 当属性为Null也更新的解决方案

使用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;



}

方案如下:

说明:

  1. 目标源:请求更新的实体数据。
  2. 数据源:通过目标源传上来的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;

/**
 * There is no royal road to learning.
 * Description:提交实体对象中的null赋值
 * Created by 贤领·周 on 2018年04月10日 15:26
 */
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);
        }

猜你喜欢

转载自blog.csdn.net/LOVE_Me__/article/details/107901209