java - 如何仅更新 Spring JPA 存储库中所有字段的子集?

标签 java spring hibernate spring-data-jpa

我想更新 User 域模型中的一个字段,但我不想处理域模型的整个实例。

更新数据在UserEncryptionData域模型类中表示。 BaseEntity (父类)保存 User 实体的主键 - 因此 JPA 拥有处理更新所需的所有信息(恕我直言)。

@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 提示:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property update found for type User!

这种方式是否可以仅更新域模型字段的子集,或者我是否必须处理整个 User 实体?

最佳答案

从数据库获取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

关于java - 如何仅更新 Spring JPA 存储库中所有字段的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42556394/

相关文章:

hibernate - Grails 2.0 中的 MappedSuperclass 替代方案

java - 将无效的xml元素添加到xml文档java

java - 如何在 Spring 应用程序上下文中添加新行作为 map 值

java - 为 API 和 Angular 内容设置 spring 主机域作为主域

java - Hibernate 5 和带有拦截器的事务回滚检测

java - 如何在 Hibernate 中注释 PostgreSQL GIN 索引

java - 增加 JButton 中的字体大小

java - 为什么无法从 WEB-INF 文件夹中加载 POSModel 文件?

java - 无法使用 SOLR 4.2 配置生成索引

java - 在 Java 8 中逐行读取 Spring Multipartfile 的最佳方法