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

时间:2017-03-02 13:09:04

标签: java spring hibernate spring-data-jpa

我想更新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实体?

1 个答案:

答案 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