Spring jpa更新当属性值为Null的时候也更新问题

  • Post author:
  • Post category:其他


spring jpa在更新的时候将属性值为空null也更新,刚开始遇到的时候是一脸懵逼啊,心理想spring jpa为什么这个功能都没有了,然后在后面我一个朋友跟我说,他说null 值 spring 不知道你是想把字段置为 null,还是你不想。所以他没有给你处理.

jpa 内部是 merge 实现的更新。所以,没有更改的字段是不会更新的.

代码处理部分:


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;

/**
 * 作用:用来实体对象中的null赋值
 * 名称:UpdateUtil
 * 时间:2017-9-28
 * 作者:Administrator
 */
public class UpdateUtil {
    /**
     * 将空值的属性从目标实体类中复制到源实体类中
     * @param src : 要将属性中的空值覆盖的对象(源实体类)
     * @param target :从数据库根据id查询出来的目标对象
     */
    public static void copyNonNullProperties(Object  src,Object target){
        BeanUtils.copyProperties(src,target,getNullProperties(src));
    }

    /**
     * 将为空的properties给找出来,然后返回出来
     * @param src
     * @return
     */
    private static String[] getNullProperties(Object src){
        BeanWrapper srcBean=new BeanWrapperImpl(src);
        PropertyDescriptor[] pds=srcBean.getPropertyDescriptors();
        Set<String> emptyName=new HashSet<>();
        for(PropertyDescriptor p:pds){
            Object srcValue=srcBean.getPropertyValue(p.getName());
            if(srcValue==null) emptyName.add(p.getName());
        }
        String[] result=new String[emptyName.size()];
        return emptyName.toArray(result);
    }
}

在controller中

 @PostMapping("/updateBanner")
    public ReturnMsg updateBanner(Banner banner){
        Banner targetBanner=bannerImpl.findBannerById(banner.getBannerId());
        UpdateUtil.copyNonNullProperties(banner,targetBanner);
        if(bannerImpl.saveBanner(banner)!=null){
            return ReturnMsgUtil.getSuccess();
        }
        return ReturnMsgUtil.getFailMsg();

    }

这是我感觉比较方便的处理方法,后面再思考一下能不能统一处理一下,然后再在这里简化一下

emmmmm….,记录一下!



版权声明:本文为qq_29407009原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。