1. 程式人生 > 程式設計 >JPA save()方法將欄位更新為null的解決方案

JPA save()方法將欄位更新為null的解決方案

這篇文章主要介紹了JPA save()方法將欄位更新為null的解決方案,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

今天在開發上碰到一個問題,在做頁面展示的時候傳給前端十個欄位,前端修改了其中3個的值,所以只傳了3個值給後端,其餘欄位預設為null,更新後其他7個欄位在全部變為了空值。

在前端沒法全量回傳所有屬性的前提下,由後端來處理這類問題。
解決方法:

1.寫一個工具方法(UpdateUtil) 用來篩選出所有的空值欄位

2.更新時先通過id搜尋原始物件,通過findone()等都可以

3.將前端傳來的不為空引數(也即是要修改值)copy覆蓋原始物件屬性值,通過BeanUtils.copyNullProperties(Object source,Object target)

以下是工具方法:

/**
 * 更新用工具類(忽略為null的欄位)
 */
public class UpdateUtil {

  /**
   * 所有為空值的屬性都不copy
   *
   * @param source
   * @param target
   */
  public static void copyNullProperties(Object source,Object target) {
    BeanUtils.copyProperties(source,target,getNullField(source));
  }

  /**
   * 獲取屬性中為空的欄位
   *
   * @param target
   * @return
   */
  private static String[] getNullField(Object target) {
    BeanWrapper beanWrapper = new BeanWrapperImpl(target);
    PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors();
    Set<String> notNullFieldSet = new HashSet<>();
    if (propertyDescriptors.length > 0) {
      for (PropertyDescriptor p : propertyDescriptors) {
        String name = p.getName();
        Object value = beanWrapper.getPropertyValue(name);
        if (Objects.isNull(value)) {
          notNullFieldSet.add(name);
        }
      }
    }
    String[] notNullField = new String[notNullFieldSet.size()];
    return notNullFieldSet.toArray(notNullField);
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。