JPA:仅更新特定字段

是否有更新的方式只有一些领域使用该方法的实体对象save从春数据JPA?

例如,我有一个这样的JPA实体:

@Entity

public class User {

@Id

private Long id;

@NotNull

private String login;

@Id

private String name;

// getter / setter

// ...

}

通过其CRUD存储库:

public interface UserRepository extends CrudRepository<User, Long> { }

在Spring MVC中,我有一个控制器,该控制器获取User用于更新它的对象:

@RequestMapping(value = "/rest/user", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE)

@ResponseBody

public ResponseEntity<?> updateUser(@RequestBody User user) {

// Assuming that user have its id and it is already stored in the database,

// and user.login is null since I don't want to change it,

// while user.name have the new value

// I would update only its name while the login value should keep the value

// in the database

userRepository.save(user);

// ...

}

我知道我可以使用来加载用户findOne,然后更改其名称并使用save…来更新它。但是,如果我有100个字段,而我想更新其中的50个字段,则更改每个值可能会很烦人。

有没有办法告诉类似“ 保存对象时跳过所有空值 ”之类的信息?

回答:

我有同样的问题,正如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)

@ResponseBody

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

}

以上是 JPA:仅更新特定字段 的全部内容, 来源链接: utcz.com/qa/436341.html

回到顶部