Spring 数据 JPA 更新方法
Spring Data JPA Update Method
我仍在寻找 Spring 的数据 JPA 中的更新方法来更新关系数据库中持久存在的给定 Object。我只找到了解决方案,在这些解决方案中,我被迫通过@Query 注释(与@Modifying 相比)指定某种 UPDATE 查询,例如:
@Modifying
@Query("UPDATE User u SET u.firstname = ?1, u.lastname = ?2 WHERE u.id = ?3")
public void update(String firstname, String lastname, int id);
为了构建查询,我还必须传递单个参数而不是 整个对象。但这正是我想要做的(传递整个对象)。
所以,我要找的是这样的方法:
public void update(Object obj);
是否可以基于Spring Data JPA 构建这样的更新方法?必须如何注释?
谢谢!
如果目标是修改实体,则不需要任何更新方法。你从数据库中获取对象,修改,JPA自动保存:
User u = repository.findOne(id);
u.setFirstName("new first name");
u.setLastName("new last name");
如果你有一个分离的实体并想合并它,那么使用CrudRepository
的save()
方法:
User attachedUser = repository.save(detachedUser);
如果您想更新实体,则不需要 JPQL 查询(可选)。可以直接使用(旧版)findOne 或(新版)findById 访问数据并进行必要的修改
Ex- here approve (entity) 已更新。
Optional<User> user= Repository.findById(id);
Registration reg = reg.get();
reg.setApproved("yes");
userRepo.save(reg);
就是这样。
这些答案没有解决问题,即如何避免所有混乱...
if (var1 != null) u.setVar1( var1 );
if (var2 != null) u.setVar2( var2 );
....
if (varN != null) u.setVarN( varN );
恶作剧。
所以,本质上,问题涉及到如何合并一个对象。不幸的是,JPA“合并”用词不当。它正在重新附加一个分离的对象。
你试过这个方案吗:
- 添加 jackson 数据绑定依赖项
- 将更新对象(源)转换为地图
Map sourceMap = objMapper.convertValue(source, Map.class);
- 使用 Java 8 个流
删除空值
- 如上转换待更新对象(target to Map)
- 使用新的Java 8 地图合并方法来更新目标与源,即
targetMap.merge( ... );
- 然后使用 objMapper 将 targetMap 转换回目标类型。
请注意,现在您有一个未附加 JPA 的更新实体,因此您必须执行 target.merge();
我仍在寻找 Spring 的数据 JPA 中的更新方法来更新关系数据库中持久存在的给定 Object。我只找到了解决方案,在这些解决方案中,我被迫通过@Query 注释(与@Modifying 相比)指定某种 UPDATE 查询,例如:
@Modifying
@Query("UPDATE User u SET u.firstname = ?1, u.lastname = ?2 WHERE u.id = ?3")
public void update(String firstname, String lastname, int id);
为了构建查询,我还必须传递单个参数而不是 整个对象。但这正是我想要做的(传递整个对象)。
所以,我要找的是这样的方法:
public void update(Object obj);
是否可以基于Spring Data JPA 构建这样的更新方法?必须如何注释?
谢谢!
如果目标是修改实体,则不需要任何更新方法。你从数据库中获取对象,修改,JPA自动保存:
User u = repository.findOne(id);
u.setFirstName("new first name");
u.setLastName("new last name");
如果你有一个分离的实体并想合并它,那么使用CrudRepository
的save()
方法:
User attachedUser = repository.save(detachedUser);
如果您想更新实体,则不需要 JPQL 查询(可选)。可以直接使用(旧版)findOne 或(新版)findById 访问数据并进行必要的修改
Ex- here approve (entity) 已更新。
Optional<User> user= Repository.findById(id);
Registration reg = reg.get();
reg.setApproved("yes");
userRepo.save(reg);
就是这样。
这些答案没有解决问题,即如何避免所有混乱...
if (var1 != null) u.setVar1( var1 );
if (var2 != null) u.setVar2( var2 );
....
if (varN != null) u.setVarN( varN );
恶作剧。
所以,本质上,问题涉及到如何合并一个对象。不幸的是,JPA“合并”用词不当。它正在重新附加一个分离的对象。
你试过这个方案吗:
- 添加 jackson 数据绑定依赖项
- 将更新对象(源)转换为地图
Map
- 使用 Java 8 个流 删除空值
- 如上转换待更新对象(target to Map)
- 使用新的Java 8 地图合并方法来更新目标与源,即
targetMap.merge( ... );
- 然后使用 objMapper 将 targetMap 转换回目标类型。
请注意,现在您有一个未附加 JPA 的更新实体,因此您必须执行 target.merge();