前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JPA实现部分字段动态更新

JPA实现部分字段动态更新

作者头像
小王不头秃
发布2024-06-19 15:05:44
2180
发布2024-06-19 15:05:44
举报

JPA实现部分字段动态更新

在使用jpa进行操作数据库时,我们经常会遇到更新数据问题。jpa的save方法可以解决这个问题,但这个方法有一个局限,在匹配到相同主键的记录是可以进行更新,但是会将传入参数的值全部更新到数据库中。 例如下面两个对象

代码语言:javascript
复制
数据库:
demo{
     id:1,
     name:one,
     number:123
     info:yes
}
传入参数:
demo2{
     id:1,
     name:two,
     number:null
     info:null
}

在上面这种情况下,你的目的可能只是更新某个值,例如只修改name在数据库的存储值,并不修改其他的值,如下图所示:

但是jpa的save默认会将demo2的值直接覆盖数据库中demo的值,此时number和info的值也会修改,结果如下图

为了实现部分更新可以采用在实体类上标注@DynamicUpdate 和配合BeanUtils的方式

代码

实现复制非空属性值的工具类

代码语言:javascript
复制
package com.example.demo.Utils;

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;
import java.util.stream.Stream;

public class JpaUtil {
    public static void copyNotNullProperties(Object src,Object target){
        BeanUtils.copyProperties(src,target,getNullPropertyNames(src));
    }

    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);
    }

}

实体类

代码语言:javascript
复制
package com.example.demo.entities;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.*;
import lombok.experimental.Accessors;
import org.hibernate.annotations.DynamicUpdate;

import javax.persistence.*;
import java.io.Serializable;

/**
 * @author xiaow
 */
@Entity
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Data
@Table(name="apply")
@Accessors(chain = true)
@JsonIgnoreProperties(value = { "hibernateLazyInitializer"})
@DynamicUpdate     //动态更新
public class Apply implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private Integer state;
    private Integer studentid;
    private Integer awardtype;
    private String info;
    private String name;
    private Integer type;
    private Integer teacherid;
   private Integer teacherstate;
}

持久层

代码语言:javascript
复制
public interface ApplyRepos extends JpaRepository<Apply,Integer> {}

事务实现层

代码语言:javascript
复制
   public int updateAll(Apply apply) {
        int a=0;
        if(apply!=null&&apply.getId() != null) {
            Apply apply1 = applyRepos.getOne(apply.getId());
            if (apply1!=null) {
            //将apply中非空的值赋给apply1中,并将apply1重新存储
                JpaUtil.copyNotNullProperties(apply, apply1);   
            }
            a=applyRepos.save(apply1).getId();
        }
        return a;
    }

这样就实现了jpa的动态更新记录

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • JPA实现部分字段动态更新
    • 代码
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档