有没有办法使用Spring Data JPA中的save
方法只更新实体对象的某些字段?
@Entity
public class User {
@Id
private Long id;
@NotNull
private String login;
@Id
private String name;
// getter / setter
// ...
}
public interface UserRepository extends CrudRepository<User, Long> { }
@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个,这可能是非常恼人的更改每个值…
难道没有办法告诉像“保存对象时跳过所有空值”这样的事情吗?
我也有同样的问题,正如M.Deinum指出的,答案是否定的,你不能使用save。主要问题是Spring数据不知道如何处理空值。空值是没有设置,还是因为需要删除而设置?
从你的问题来看,我想你也有和我相同的想法,那就是save可以让我避免手动设置所有更改的值。
那么有没有可能避免所有的manuel映射呢?好吧,如果您选择遵守惯例,即nulls总是表示“未设置”,并且您有原始的模型id,那么是的。您可以通过使用Springs beanutils自己避免任何映射。
如何使用springframework BeanUtils CopyProperties忽略空值?
所以把所有的东西放在一起,你会得到这样的结果
@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? 例如,我有一个这样的JPA实体: 通过其CRUD存储库: 在Spring MVC中,我有一个控制器,该控制器获取用于更新它的对象: 我知道我可以使用来加载用户findOne,然后更改其名称并使用save…来更新它。但是,如果我有100个字段,而我想更新其中的50个字段,则更改每个值可能会很烦人。 有没有办法告诉类似“ 保
我一直在尝试改装,我真的很简单。 然而,我有一个奥化的担忧。我正在为我的后端使用Parse,它有一个纯restapi。 当我想要更新一个对象时,我使用一个,并只在
以下是我要保存(创建/更新)的实体模型: 有两种方法可以更新此实体: < li >第一个更新除< code>notified属性以外的所有属性的人 < li >第二个更新< code>notified属性的仅 有没有办法告诉Hibernate忽略某个特定方法的某些字段?我需要创建两个不同的特定dao方法吗?我是否需要为经典的< code>save方法保留< code>updatable=false
我的用户表有以下存储库界面。 我想禁用在用户表中插入新实体,并仅在存在现有条目的情况下使用保存功能来更新现有条目。我如何才能做到这一点?是否有可以传递到存储库界面的选项?或者,当没有匹配的实体时,我应该重写save方法而不执行任何操作吗?
问题内容: 下面我展示了一个长JSON结构的特定部分 现在,如果我要更新上述JSON结构中的任何值,例如说将firstName从“ Bob”更改为“ Angel”,我如何才能有效地替换firstName,以便在使用Web套接字时将其反映在DOM中。由于JSON巨大,因此我将使用 ng-repeat 绑定数据。目前,我正在重新加载整个数据以查看DOM中的更改,而我不需要这样做。 从Web套接字,如果
我正在使用Spring Data MongoDB和Spring Data Rest创建一个Rest API,它允许对我的MongoDB数据库进行GET、POST、PUT和DELETE操作,除了更新操作(PUT)之外,其他操作都很好。只有当我在请求体中发送完整对象时,它才起作用。 我试着在这里搜索一个解决方案,但我只找到了以下帖子,但没有解决方案:如何使用MongoRepository接口更新mon