使用昵称作为主键更新表的行

时间:2015-05-17 09:22:15

标签: java sql spring postgresql

enter image description here

当我尝试使用Spring来更新具有不同值的用户时,例如,不修改昵称:

//TODO: encripta contraseña monitorDao
public void updateMonitor(Monitor monitor){
    BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor(); 
    String contrasenya = passwordEncryptor.encryptPassword(monitor.getContrasenya());
    this.jdbcTemplate.update(
            "update Usuario set nickname=?, nombre= ?, apellidos= ?, email= ?, contrasenya = ?, especialidades = ?, telefono = ?", 
            monitor.getNickname(), monitor.getNombre(), monitor.getApellidos(), monitor.getEmail(), 
            contrasenya, monitor.getEspecialidades(), monitor.getTelefono()
            );
}

发生这种情况:

  

请求处理失败;嵌套异常是   org.springframework.dao.DuplicateKeyException:   PreparedStatementCallback; SQL [更新Usuario set nickname =?,nombre =   ?,apellidos = ?, email = ?, contrasenya = ?, especialidades = ?,,   telefono =?];错误:重复键值违反唯一约束   “pk_usuario”

2 个答案:

答案 0 :(得分:3)

我从未使用过JDBC模板,但看起来您的SQL中没有where子句,因此您需要更新数据库中的所有行以获取这些值。您需要通过添加where子句将其限制为单个用户:

this.jdbcTemplate.update(
        "update Usuario set nickname=?, nombre= ?, apellidos= ?, email= ?, contrasenya = ?, especialidades = ?, telefono = ? where nickname=?", 
        monitor.getNickname(), monitor.getNombre(), monitor.getApellidos(), monitor.getEmail(), 
        contrasenya, monitor.getEspecialidades(), monitor.getTelefono(), monitor.getNickname()
        );

请参阅http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html#jdbc-JdbcTemplate-examples-update

答案 1 :(得分:0)

在我看来你应该试试这个:

this.jdbcTemplate.update(
    "update Usuario set nombre= ?, apellidos= ?, email= ?, contrasenya = ?, especialidades = ?, telefono = ? where nickname=?", 
   monitor.getNombre(), monitor.getApellidos(), monitor.getEmail(), 
    contrasenya, monitor.getEspecialidades(), monitor.getTelefono(), monitor.getNickname()
    );

这不会更新昵称。