Неверное имя столбца в Java, но работает в базе данных

Учитывая следующий (MYSQL-) запрос:

SELECT view_match_metric.player_id, discord_id, view_match_metric.name, 
  view_match_metric.xp AS xpthis, player.xp AS xptotal, ranked, mode, mu, sigma, 
  IF(team = 'Alpha', goals_alpha > goals_beta, goals_beta > goals_alpha) as won 
FROM view_match_metric 
LEFT OUTER JOIN kl_idmap ON view_match_metric.player_id = kl_idmap.player_id 
LEFT OUTER JOIN kl_trueelo ON view_match_metric.player_id = kl_trueelo.player_id 
LEFT OUTER JOIN player ON view_match_metric.player_id = player.player_id 
WHERE match_id="169498" 

Когда я выполняю его в своей программе базы данных (Adminer), он возвращает следующий результат:

Обратите внимание, что он содержит int(10) неподписанных записей для xpthis и xptotal

Однако в Java этот запрос

java.sql.SQLException: Invalid column name
at com.sun.rowset.CachedRowSetImpl.getColIdxByName(Unknown Source)
at com.sun.rowset.CachedRowSetImpl.getInt(Unknown Source)

для поля xpthis и xptotal. Это работает без получения этих полей. Поскольку поля xp неоднозначны в нескольких таблицах, я указываю их с этими псевдонимами.

код для загрузки данных:

while (result.next()) {
    match.mode = result.getString("mode");
    match.ranked = result.getBoolean("ranked");
    TrueEloPlayerData player = new TrueEloPlayerData();
    player.id = result.getLong("player_id");
    player.discordID = result.getLong("discord_id");
    player.name = result.getString("name");
    //exception thrown in next line:
    player.xp = result.getInt("xpthis");
    player.level = Utility.getLevel(result.getInt("xptotal"));
    //some more
    match.players.add(player);
}

Для параллельной обработки обычный ResultSet копируется в CachedRowSet:

CachedRowSet res = RowSetProvider.newFactory().createCachedRowSet();
res.populate(resultSet);

Я пытался получить их с помощью getDouble, getString, даже с getObject, пытался получить прямой доступ к полям без псевдонима (getInt(tablename.xp)), однако это никогда не решало проблему.

Я совершенно не понимаю, почему здесь не работает, как в базе данных.

1 ответ

Решение

Существует также другой метод с тем же именем, основанный на индексе.

int getInt(int columnIndex) throws SQLException

Попробуйте посмотреть, если работа. Как я вижу из изображения в 4 индекса (начать нумерацию столбцов с 1)

player.xp = result.getInt(4);
Другие вопросы по тегам