更新方法中的可选项始终运行并将值设置为0

问题描述

我正在使用Optionals的更新方法,该方法一旦运行将更新其各自的postgres db列,前几个是字符串,并且更新良好。最后两个是INT(授权和ChapterProgress),当我调用它们中的第一个以更新其值时,它将另一个基于INT的可选值设置为0,反之亦然。问题代码是下面的最后两个可选选项:

private final UserDao userDao;

//constructor
@Autowired
public UserService(@Qualifier("postgres1")UserDao userDao) {
    this.userDao= userDao;
}
//methods

public int addUser(UUID id,User user) {
    UUID newId = Optional.ofNullable(id)
            .orElse(UUID.randomUUID());
    return userDao.insertUser(newId,user);
}

public List<User> getAllUsers(){
    return userDao.selectAllUsers();
}

@GetMapping
public Optional<User> getUserById(UUID id){
    return userDao.selectUserByID(id);
}

public int deleteUser(UUID id) {
    return userDao.deleteUserById(id);
}

@PutMapping
public void updateUser(UUID id,User user) {

Optional.ofNullable(user.getSurname())
.filter(surname -> !StringUtils.isEmpty(surname))
.map(StringUtils::capitalize)
.ifPresent(surname -> userDao.updateSurname(id,surname));

Optional.ofNullable(user.getFirstname())
.filter(firstname -> !StringUtils.isEmpty(firstname))
.map(StringUtils::capitalize)
.ifPresent(firstname -> userDao.updateFirstname(id,firstname));

Optional.ofNullable(user.getUsername())
.filter(uname -> !StringUtils.isEmpty(uname))
.ifPresent(uname -> userDao.updateUsername(id,uname));

Optional.ofNullable(user.getpassword())
.filter(pw -> !StringUtils.isEmpty(pw))
.ifPresent(pw -> userDao.updatePassword(id,pw));

Optional.ofNullable(user.getAuthorisation())
.filter(auth -> !StringUtils.isEmpty(auth))
.ifPresent(auth -> userDao.updateAuthorisation(id,auth));

Optional.ofNullable(user.getChapterProgress())
.filter(cp -> !StringUtils.isEmpty(cp))
.ifPresent(cp -> userDao.updateChapterProgress(id,cp));

}

我尝试注释掉每个过滤器上的.filter行,但没有任何改变。

使用者Dao看起来像这样。

public interface UserDao {

int insertUser(UUID id,User user);//good

default int insertUser(User user) {//good
    UUID id = UUID.randomUUID();
    return insertUser(id,user);
}

List<User> selectAllUsers();//good

Optional<User> selectUserByID(UUID id);//good

int deleteUserById(UUID id);//good

int updateUserById(UUID id,User newUser);//good

int updateSurname(UUID id,String surname);//good

int updateFirstname(UUID id,String firstname);//good

int updateUsername(UUID id,String username);//good

int updatePassword(UUID id,String password);//good

int updateAuthorisation(UUID id,int authorisation);//

int updateChapterProgress(UUID id,int chapterProgress);//

并在UserDataAccessServcie中实现,如下所示:

private JdbcTemplate jdbcTemplate;

@Autowired
public UserDataAccessService(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate= jdbcTemplate;
}

@Override//create
public int insertUser(UUID id,User user) {
    String sql ="INSERT INTO users(id,surname,firstname,username,password,authorisation,chapterprogress) VALUES (?,?,?);";
    return jdbcTemplate.update(sql,id,user.getSurname(),user.getFirstname(),user.getUsername(),user.getpassword(),user.getAuthorisation(),user.getChapterProgress()
    );
}

@Override//read all
public List<User> selectAllUsers() {
final String sql= "SELECT * FROM users";
    return jdbcTemplate.query(sql,(resultSet,i)->{
        return new User(UUID.fromString(
                resultSet.getString("id")),resultSet.getString("surname"),resultSet.getString("firstName"),resultSet.getString("userName"),resultSet.getString("password"),resultSet.getInt("authorisation"),resultSet.getInt("chapterProgress"));
    });
}

@Override//read single
public Optional<User> selectUserByID(UUID id) {
    final String sql= "SELECT * FROM users WHERE id=?";
    User user= jdbcTemplate.queryForObject(sql,new Object[] {id},i) ->{
        return new User(
                UUID.fromString(resultSet.getString("id")),("firstName"),("userName"),("password"),resultSet.getInt("chapterProgress"));
    });
    return Optional.ofNullable(user);
}

@Override//update//possibly to authorisation problem,consider changing 
        //to void to stop returning a '0'
public int updateUserById(UUID id,User newUser) {
    return 1;
}

@Override
public int updateSurname(UUID id,String surname) {
    String sql ="UPDATE users"
            + " SET surname = ? "
            + "WHERE id = ?";
    return jdbcTemplate.update(sql,id);
}

@Override
public int updateFirstname(UUID id,String firstname) {
    String sql ="UPDATE users SET firstName = ? WHERE id = ?";
    return jdbcTemplate.update(sql,id);
}

@Override
public int updateUsername(UUID id,String username) {
    String sql = "UPDATE users SET username = ? WHERE id = ?";
    return jdbcTemplate.update(sql,id);
}

@Override
public int updatePassword(UUID id,String password) {
    String sql = "UPDATE users SET password = ? WHERE id = ?";
    return jdbcTemplate.update(sql,id);
}

@Override
public int updateAuthorisation(UUID id,int authorisation) {
    String sql = "UPDATE users SET authorisation = ? WHERE id = ?";
    return jdbcTemplate.update(sql,id);
}

@Override
public int updateChapterProgress(UUID id,int chapterProgress) {
    String sql = "UPDATE users SET chapterprogress = ? WHERE id = ?";
    return jdbcTemplate.update(sql,chapterProgress,id);
}

@Override//delete
    public int deleteUserById(UUID id) {
        final String sql= "DELETE FROM users WHERE id=?";
        jdbcTemplate.update(sql,id);
        return 1;
    }

我有种忘记/做一些简单的事情的感觉,但是对我的帮助非常感谢

谢谢

解决方法

结果是这是两个get方法的返回类型。通过使用Integer作为数据类型并返回Integer而不是int,它允许db操作并存储它。