org.postgresql.util.PSQLException: неверное значение для типа int: (простая вставка JDBC)

#java #postgresql #jdbc

#java #postgresql #jdbc

Вопрос:

Я пытаюсь вставить данные через jdbc в мою недавно созданную таблицу в postgresql, которая является

 public class Workers  {
private int id;
private String first_name; 
private String last_name;
private String state;
private Integer base_salary;

public void Workers(int id, String first_name,String last_name,String state,Integer base_salary) {
    this.id=id;
    this.first_name=first_name;
    this.last_name=last_name;
    this.state=state;
    this.base_salary=base_salary;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getFirst_name() {
    return first_name;
}

public void setFirst_name(String first_name) {
    this.first_name = first_name;
}

public String getLast_name() {
    return last_name;
}

public void setLast_name(String last_name) {
    this.last_name = last_name;
}

public String getState() {
    return state;
}

public void setState(String state) {
    state = state;
}

public Integer getBase_salary() {
    return base_salary;
}

public void setBase_salary(Integer l) {
    this.base_salary = l;
}

}
  

Код Postgres:

 create table worker
(
    first_name varchar(20) ,
    last_name varchar(20)  ,
    state varchar(20)  ,
    base_salary integer
);
  

Java: JDBC:

  String query ="INSERT into worker(first_name,last_name,state,base_salary) values (?,?,?,?);";
    ResultSet keys = null;

    try(
            Connection conn = DB.getConnection();
            PreparedStatement stmt = conn.prepareStatement(query,Statement.RETURN_GENERATED_KEYS);
    ) {
        stmt.setString(1, worker.getFirst_name());
        stmt.setString(2, worker.getLast_name());
        stmt.setString(3, worker.getState());
        stmt.setInt(4, worker.getBase_salary());
        
        int affected= stmt.executeUpdate();
        
        if(affected==1) {
        keys=stmt.getGeneratedKeys();
        keys.next();
        int newKey = keys.getInt(1);
        worker.setId(newKey);
        } else {
            System.out.println("No rows affected please try again");
            return false;
        }
    } catch (SQLException e) {
        System.err.println(e);
        return false;
    } finally {
        if(keys !=null) keys.close();
    }

    return true;
}
  

Код основного класса:

    Workers worker = new Workers();
    
   EmployeesManipulation.displayAllRows();
    
   worker.setFirst_name(InputHelper.getInput("User name: "));//First_name is String
   worker.setLast_name(InputHelper.getInput("Last name: "));//last_name is String
   worker.setState(InputHelper.getInput("State: "));// State is String
   worker.setBase_salary(InputHelper.getIntegerInput("base Salary:"));//Base_salaryInteger 
  

Объяснение вывода:

Мой ввод:

 User name:  Fares
Last name:  Essayeh
State:      New york
Base Salary: 12345
  

Вывод:

org.postgresql.util.PSQLException: неверное значение для типа int: тарифы

Обратите внимание: после обновления моей базы данных на Java выводится следующее:

 full_name: Fares Essayehstate: nullbase_salary
  

Комментарии:

1. Похоже, что параметры вашего запроса где-то по пути перепутались. Вы пробовали отслеживать с помощью отладчика, чтобы увидеть, какие значения в конечном итоге передаются различными setXXX() методами?

2. я добавляю класс, кажется, что-то не соответствует значениям типа данных

3. ДА. Может быть, кто-то более проницательный, чем я, сразу заметит проблему. Но если бы это был мой код, я бы отключил отладчик. Одна точка останова и пара одиночных шагов, и, скорее всего, у вас будет ответ.

4. Спасибо за усилия, я все равно выполню отладку

5. Я не уверен, но попробуйте отправить intValue baseSalary следующим образом: stmt.SetInt(4, worker.getBase_salary().intValue());

Ответ №1:

Таблица не имеет автоматически сгенерированного идентификатора. Сначала вы должны изменить его на

 create table worker(
 id serial primary key not null,
 first_name varchar(20) ,
 last_name varchar(20)  ,
 state varchar(20)  ,
 base_salary integer
);
  

id Поле также может иметь GENERATED AS IDENTITY , но я базы данных, которые у меня есть для тестирования перед предоставлением ответа, устарели и не поддерживают этот синтаксис.

Я бы посоветовал вам изменить запрос на следующий:

 INSERT INTO worker(first_name,last_name,state,base_salary) VALUES (?,?,?,?) RETURNING id
  

Вам не нужна завершающая точка с запятой ; при использовании API-интерфейсов подключения, подобных этому, из других языков.