栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JPA:仅更新特定字段

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JPA:仅更新特定字段

我有同样的问题,正如Deinum先生所指出的,答案是否定的,你不能使用save。主要问题是Spring Data不知道如何处理null。是否设置了空值,还是因为需要将其删除而设置了空值?

现在从你的问题来看,我假设你也有同样的想法,那就是保存将使我避免手动设置所有更改的值。

那么有可能避免所有的手动映射吗?好吧,如果你选择遵守空值始终表示“未设置”的约定,并且你拥有原始的模型ID,则可以。你可以使用Springs BeanUtils来避免自己进行任何映射。

你可以执行以下操作:

  1. 读取现有对象
  2. 使用BeanUtils复制值
  3. 保存对象

现在,Spring的BeanUtils实际不支持不复制空值,因此它将覆盖现有模型对象上未设置空值的任何值。幸运的是,这里有一个解决方案:

因此,将所有这些放在一起,最终会得到这样的结果

@RequestMapping(value = "/rest/user", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE)@ResponseBodypublic ResponseEntity<?> updateUser(@RequestBody User user) {   User existing = userRepository.read(user.getId());   copyNonNullProperties(user, existing);   userRepository.save(existing);   // ...}public static void copyNonNullProperties(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);}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/411304.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号