Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何仅更新表单中选定的记录?_Java_Spring_Spring Boot_Hibernate_Jpa - Fatal编程技术网

Java 如何仅更新表单中选定的记录?

Java 如何仅更新表单中选定的记录?,java,spring,spring-boot,hibernate,jpa,Java,Spring,Spring Boot,Hibernate,Jpa,主要问题是,如何只更新表单中的几个选定字段。我想让用户选择他们想要更新的字段。例如,我有表单类: 公共类用户注册表单{ 私有整数用户标识; @NotNull 私有字符串名称; @NotNull 私家姓; @电子邮件 @NotNull 私人字符串电子邮件; @NotNull 私有整数genderId; @NotNull 私有整数groupId; @NotNull 私人名单联系人信息; @NotNull 私有字符串userSecretkey; @NotNull 私有字符串密码; @NotNull 启

主要问题是,如何只更新表单中的几个选定字段。我想让用户选择他们想要更新的字段。例如,我有表单类:

公共类用户注册表单{
私有整数用户标识;
@NotNull
私有字符串名称;
@NotNull
私家姓;
@电子邮件
@NotNull
私人字符串电子邮件;
@NotNull
私有整数genderId;
@NotNull
私有整数groupId;
@NotNull
私人名单联系人信息;
@NotNull
私有字符串userSecretkey;
@NotNull
私有字符串密码;
@NotNull
启用私有布尔值;
@NotNull
私有布尔重置密码;

之后,我将在
@Entity
User
中设置字段,例如,如果用户只想更改他们的姓名,我想通过
findById()从现有的
User
中获取其余字段
方法,然后更改几个字段并将更改后的对象保存到数据库。

@BeshambherChaukhwan好的,在我使用示例的地方可能会更容易,所以我有一个控制器,当是方法:

    @PostMapping(value = "{id}/updateuser")
    public ResponseDTO updateUser(@PathVariable int id, @RequestBody UserRegistrationform userForm, BindingResult bindingResult) {
        User user = userRepository.findById(id);
        if (user == null) {
            return ResponseDTO.of(Messages.Error_UserNotFound_MSG.getMessage(), ErrorCodes.NOT_FOUND);
        } else if (bindingResult.hasErrors()) {
           return ResponseDTO.of(bindingResult.getAllErrors().toString(), ErrorCodes.INVALID_FIELDS);
        }
        user.setName(userForm.getName);
        user.setSurname(userForm.getSurname);
        user.setEmail(userForm.getEmail);
        .
        .
        .
        userRepository.save(user);
        return ResponseDTO.of(Messages.SUCCESS_Update_MSG.getMessage());
        }

问题是,正如您所注意到的,当表单中有人遗漏了几个字段时,我会用空值更新正确的字段

这是否回答了您的问题?首先,这个类中的所有变量都有
@NotNull
意味着它们是表单中的必填字段,所以用户必须全部输入,否则api将返回错误的requestunform完全没有,因为我有相同的表单来注册用户,我也想使用相同的表单来更新用户,主要的问题是,当用户注册时,我需要拒绝空字段,但是如果他注册正确,然后他想更新他的几个字段,他可以选择他想要的字段update@BeshambherChaukhwan我认识贝考就像我在上面写的一样,我想使用相同的表单来注册和更新用户值,但它仍然不允许所有字段都为空值,因此您必须获取所有值,然后逐个手动更改所需的字段。现在,如果我使用UserRegistrationForm,而用户不填充字段,我将得到错误响应,因为我有一个注释,字段不能为null不,它们不会为null,因为您正在UserRegistrationForm中使用
@NotNull
,即使您从字段中删除
@NotNull
,您也需要先检查
如果(userForm.getName()!=null)
然后设置它们。这是我所说的手动工作。您将只更新您想要的字段,并且只更新正在设置的字段。也许您还可以检查旧值是否等于新值,但这不会有任何区别,因为
User User=userRepository.findById(id);
将有正确的旧数据和它在您的控制下在什么时候更新哪个字段。哦,不,还有其他方法吗?因为我知道手动设置字段,当我有例如5个字段时,这是可以的,但是当我从80个字段更新30个字段时,将需要很多行代码。在这种情况下,您将以不同的格式封装字段nt类。我为不同的API使用不同的类。我在类中有类,比如你可以在一个类中输入名字和姓氏,在另一个类中输入用户角色权限信息,在另一个类中输入用户地址相关字段,然后在不同的API中使用它们。在不同的场景中使用同一个类是不好的,因为你会强制执行手动设置字段。