首页 > 解决方案 > 更新方法中的选项始终运行并将值设置为 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 行,但没有任何改变。

用户道是这样的。

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}, (resultSet,i) ->{
        return new User(
                UUID.fromString(resultSet.getString("id")),
                resultSet.getString("surname"), ("firstName"), ("userName"), ("password"),
                resultSet.getInt("authorisation"),
                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, surname, id);
}

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

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

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

@Override
public int updateAuthorisation(UUID id, int authorisation) {
    String sql = "UPDATE users SET authorisation = ? WHERE id = ?";
    return jdbcTemplate.update(sql, authorisation, 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;
    }

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

谢谢

标签: javapostgresqlintegersql-updatereturn-type

解决方案


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


推荐阅读