次の (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"
データベース プログラム (管理者) で実行すると、次の結果が返されます。
xpthis および xptotal の int(10) unsigned エントリが含まれていることに注意してください。
ただし、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)) なしでフィールドに直接アクセスしようとしましたが、問題は解決しませんでした。
データベースのようにここで機能しない理由がまったくわかりません。