【day41】springdatajpa 实现灵活控制字段更新

  • save()方法在不指定主键的情况下,即实体对象的主键为null时,执行的是insert操作,
    而在指定主键的情况下,执行的操作为update操作,是将指定主键对应的那条记录的所有字段,更新为实体对象的每个对应属性的值,包括null值,它也会帮你更新,这方面看来显得不是很聪明
	@Override
    public Object updateByOid(PageData pd) {
        BjUser bjUser = JSONObject.parseObject(JSONObject.toJSONString(pd), BjUser.class);
        //.get()方法使从Optional<User>中拿出对象
        BjUser bjUserOld = bjUserReponsitory.findById(bjUser.getOid()).get();
        BeanUtils.copyProperties(bjUser,bjUserOld,getNullPropertyNames(bjUser));
        BjUser save = bjUserReponsitory.save(bjUserOld);
        return ResultUtil.success(save);
    }
}

  //获取非空属性
    public static String[] getNullPropertyNames (Object source) {
        final BeanWrapper src = new BeanWrapperImpl(source);
        java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();

        Set<String> emptyNames = new HashSet<String>();
        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);
    }

  • 实体类上方加入@DynamicUpdate 注解
@Entity
@Data
@DynamicUpdate //只更新变化的字段
public class BjUser {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long oid;
    private String username;
    private String password;
}
  • JPA模块提供了辅助工具类帮助我们获取非空属性和拷贝到另一个对象的方法,结合save方法的特性我们就可以实现动态的更新一条记录的字段的值。但是程序中可以发现,在执行更新操作前需要进行一次数据库的查询操作,如果数据量较大的情况下会对数据库造成不小的负担。所以在程序中如果有需要对部分字段更新时,最好考虑是不是能用更直接的方法达到效果,但如果字段较多且不确定的话,框架提供的这个方法也是挺方便的。

SpringDataJPA更新部分字段

Spring boot jpa 中 findById返回类型变化

springboot 中 @DynamicUpdate 注解无效解决方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值