您好,登錄后才能下訂單哦!
springjpa中出現局部更新字段如何解決?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
使用springjpa更新數據時,有時候我們需要更新部分字段,對已有的內容保持不變,通常我們可以通過Spring提供的bean工具類BeanUtils來實現
BeanUtils復制對象,BeanUtils中的構造方法屬性中可以通過傳入更新時忽略的屬性值來實現選擇性復制原對象的字段。更新部分字段時,我們僅需要傳入復制后的字段即可。
BeanUtils的構造方法:
具體更新部分字段的步驟:
查詢出待更新對象的原有信息
通過傳入的更新的象去復制產生一個新對象,其中新對象中為null的字段不需要更新。
執行更新操作,操作對象時步驟2得出的復制對象。
代碼如下:
public Result update(@RequestBody AppScene appScene, @PathVariable String id ){ AppScene target = appSceneService.findById(id); //數據庫查出待更新對象 BeanUtils.copyProperties(appScene,target,getNullPropertyNames(appScene)); //使用更新對象的非空值去覆蓋待更新對象 appSceneService.update(target ); //執行更新操作 return new Result(true,StatusCode.OK,"修改成功"); }
其中涉及的getNullPropertyNames方法作為工具類存在,具體如下:
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); }
這是之前剛開始學習框架的時候遇到的問題,其實這個問題spring早就提供了對應的方法去解決,它提供了對應bean拷貝的方法BeanUtils.copyProperties,通過傳入不同的值決定是否要忽略非空屬性值的拷貝,現在已經沒有必要自己手寫了。
補充:Java Jpa選擇性更新、部分字段更新工具類
使用Jpa自帶的Save方法更新實體類時,會覆蓋數據庫中實體類原有內容。如果我們只想更新一部分字段或是選擇性的更新,就只能另辟蹊徑了。
這個工具類很好地彌補了這個不足,對于待更新實體類中有內容的字段會更新,為空的字段會采用原數據庫中內容,下面是工具類代碼(附使用方法)。
import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import java.util.HashSet; import java.util.Set; /** * jpa 部分字段更新方法 */ public class UpdateColumnUtil { public static String[] getNullPropertyNames(Object source) { final BeanWrapper src = new BeanWrapperImpl(source); java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors(); Set<String> emptyNames = new HashSet<>(); 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); } }
//首先從數據庫查出待更新對象 Customer target = customerService.findById(customer.getCustId()); //使用更新對象的非空值去覆蓋待更新對象 BeanUtils.copyProperties(customer, target, UpdateColumnUtil.getNullPropertyNames(customer)); //執行更新操作 save = customerService.save(target);
關于springjpa中出現局部更新字段如何解決問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。