Запрос на обновление JDBC, обновляющий все столбцы, когда на самом деле я обновляю только несколько столбцов - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь обновить только несколько столбцов с помощью JDBC.

try (Session session = getSessionFactory().openSession(); Connection connection = SessionUtil.getDBConnection(session)){

    connection.setAutoCommit(false);

    String query = "UPDATE Employee SET fname=?, lname=? where id=?";   
    prepareStatement = connection.prepareStatement(query);

    for (Employee employee : employeeList) {
        for(int i=1; i<=3; i++){
            if(i==1){
                prepareStatement.setString(i, employee.getFName());
            }
            else if(i==2){
                prepareStatement.setString(i, employee.getLName());
            }
            else if(i==3){
                prepareStatement.setString(i, employee.getID());
            }                                   
        }                           
        prepareStatement.addBatch();
    }
    prepareStatement.executeBatch();                                
    connection.commit();
} catch (Exception e) {         
    e.printStackTrace();
} 

Здесь я пытаюсь обновить только fname и lname в таблице Employee. Но когда я проверяю сгенерированный SQL-запрос (из журналов show_sql), я вижу, что в запросе на обновление есть все столбцы в разделе set.

Нет ли способа ограничить количество обновляемых столбцов. Кроме того, поскольку я обновляю только 2 столбца в запросе, который я передал PreparedStatement, разве он не должен делать то же самое вместо попытки обновить все столбцы?

1 Ответ

1 голос
/ 27 июня 2019

У вас есть три setString звонка с одинаковым i, поэтому вы перезаписываете все столбцы с getID(). Просто бросьте внутренний цикл for, и все будет в порядке:

for (Employee employee : employeeList) {
     prepareStatement.setString(1, employee.getFName());
     prepareStatement.setString(2, employee.getLName());
     prepareStatement.setString(3, employee.getID());
     prepareStatement.addBatch();
}
prepareStatement.executeBatch();         
...