Публикация имени столбца как целого - PullRequest
1 голос
/ 17 января 2012

У меня есть gameid, hometeamid, visitorteamid, winnerid все как int.

Запрос

Update game set winnerid=hometeamid where gameid=1; 

отлично работает на верстаке Mysql.

Я пытаюсь запустить то же самое из подготовленного оператора без успеха, выдавая ошибку

java.sql.BatchUpdateException: Incorrect integer value: 'hometeamid' for column 'winnerId' at row 1

, так как "hometeamid" передается в виде строки. код выглядит следующим образом

String query = "update `match` set winnerid= ? where  gameid=?";
Map<Integer, String> data = getMap();//gameid and either 'hometeamid' or 'awaytemid'
try {
    PreparedStatement ps = connection.prepareStatement(query);
for (Map.Entry<Integer, String> entry : data.entrySet()) {
    ps.setObject(1, entry.getValue());
    ps.setInt(2, entry.getKey());
    ps.addBatch();
}
ps.executeBatch();
} catch (SQLException e) {
        logger.error(e, e);
} finally {
    closeQuietly(connection);
}

Как правильно запустить обновление из PreparedStatement?

Любые другие рекомендации по улучшению приветствуются.

Ответы [ 2 ]

1 голос
/ 17 января 2012

Вы не можете передать имя столбца в качестве параметра в подготовленном операторе. Вы можете только передавать значения.

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

1 голос
/ 17 января 2012

Измените ваш запрос на что-то вроде:

String query = "update `match` set winnerid = case when ? = 'hometeamid' then hometeamid else visitorteamid end where  gameid=?"
...