我想更新User
域模型中的一个字段,但我不想处理整个域模型实例。
更新数据在UserEncryptionData
域模型类中表示。 BaseEntity
(父类)拥有User
实体的主键 - 因此JPA具有处理更新所需的所有信息(IMHO)。
@Entity
@Table(name = "users")
public class UserEncryptionData extends BaseEntity {
@Column(nullable = false, name = "salt", unique = true)
@JsonProperty("salt")
private String salt;
public String getSalt() {
return salt;
}
public void setSalt(String salt) {
this.salt = salt;
}
}
在UserRepository
我想更新这些数据:
public interface UserRepository extends BaseRepository<User, UUID> {
User update(UserEncryptionData encryptionData);
// the rest omitted...
}
但是Spring抱怨道:
引起: org.springframework.data.mapping.PropertyReferenceException:没有 找到类型为用户的属性更新!
这种方式是否只能更新域模型字段的子集,还是我必须处理整个User
实体?
答案 0 :(得分:1)
从数据库中获取后,可以在UserEncryptionData
对象上使用save方法,并修改需要更新的字段,Spring将完成这项工作。
UserEncryptionData user = userRepository.findById("id");
user.setSalt("updated salt");
user.save();
但是,如果您只想更新一个字段,则必须使用@Modifying
和@Query
注释编写自己的更新查询:
@Modifying
@Query("update UserEncryptionData u set u.salt = :salt where u.id = :id")
int setUserById(@Param("salt") String salt, @Param("id") Long id);
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.modifying-queries