2015-11-28 2 views
1

Я получаю исключение по обновлению Postgres: org.postgresql.util.PSQLException: Невозможно определить тип SQL ...Postgresql обновление - Использование ArrayList

Вот код, где я строю оператор SQL динамически и добавить Титулы:

public Boolean update(UserData usrData){ 
    String sqlUpdateUser = "UPDATE \"USER\" "; 
    String sqlSetValues = "SET"; 
    String sqlCondition = "Where \"USER_ID\" = ? "; 

    List<Object> params = new ArrayList<Object>(); 
    List<Integer> types = new ArrayList<Integer>(); 

    if(usrData.getFirstName() != null){ 
     sqlSetValues = sqlSetValues.concat(" \"FIRST_NAME\" = ? ").concat(", "); 
     params.add(usrData.getFirstName()); 
     types.add(Types.VARCHAR); 

    } 

    if(usrData.getMiddleName() != null){ 
     sqlSetValues = sqlSetValues.concat("\"MIDDLE_NAME\" = ? "); 
     params.add(usrData.getMiddleName()); 
     types.add(Types.VARCHAR); 
    } 

    params.add(usrData.getUserId()); 
    types.add(Types.BIGINT); 

    Object[] updateParams = new Object[params.size()]; 
    updateParams = params.toArray(updateParams); 

    Integer[] paramTypes = new Integer[types.size()]; 
    paramTypes = types.toArray(paramTypes); 


    sqlUpdateUser = sqlUpdateUser.concat(sqlSetValues).concat(sqlCondition); 
    int rowsAffected = this.jdbcTemplate.update(sqlUpdateUser, updateParams, paramTypes); 

    if(rowsAffected > 0){ 
     return Boolean.TRUE; 
    }else{ 
     return Boolean.FALSE; 
    } 

} 

и схема таблицы для таблицы USER является:

"FIRST_NAME" character varying(50), 
"MIDDLE_NAME" character varying(50), 

Если я сделать обновление статический без использования коллекции , но, используя Array, я не вижу проблемы. кода пропущено с использованием массивов:

Object[] param = { usrData.getFirstName(), usrData.getMiddleName(), usrData.getUserId() }; 
int[] type = { Types.VARCHAR, Types.VARCHAR, Types.BIGINT }; 
int rowsAffected = this.jdbcTemplate.update(sqlUpdateUser, param, type); 

ли я что-то отсутствует?

Благодаря K

ответ

0

переместить эти строки

Object[] updateParams = new Object[params.size()]; 
    updateParams = params.toArray(updateParams); 

    Integer[] paramTypes = new Integer[types.size()]; 
    paramTypes = types.toArray(paramTypes); 

под

params.add(usrData.getUserId()); 
    types.add(Types.INTEGER); 

В вашем случае вам не хватает, чтобы добавить usrData.getUserId() в updateParams.

+0

Извините, это не помогло! ... любые другие указатели? – Kiran

+0

Можете ли вы проверить точные значения sqlUpdateUser, updateParams, paramTyoes, передаваемых в этой строке - int rowsAffected = this.jdbcTemplate.update (sqlUpdateUser, updateParams, paramTypes); –

+0

Я проверил их - UpdateParams значение: n_update4 | G_update4 | 66 & Соответствующие значения ParamTypes 12 | 12 | -5 .. И эти значения такие же, когда они передаются как нормальный массив, и когда они передаются как массив, созданный из ArrayList ..... Так что с этими проблемами я зациклился на том, как мне динамически построить оператор Update. – Kiran

Смежные вопросы