SQLException: 结果集关闭

SQLException: ResultSet closed

我正在尝试执行方法,该方法应该使用数据库中的字段创建一个新对象,并且每次我 运行 这段代码都会收到 SQLException: ResultSet closed。

 public DatabasedClient getDatabaseClient(int clientDatabaseid){
    if(DatabaseClientUtil.isInDatabase(clientDatabaseid)){
        return DatabaseClientUtil.getDBClient(clientDatabaseid);
    }else{
        try{
            System.out.println("Trying to find user in db");
            ResultSet rs = fbot.getStorage().query("select * from database_name where clientDBId = " + clientDatabaseid);
            System.out.println("deb " + rs.getString("nick"));
            while (rs.next()) {
                DatabasedClient databasedClient = new DatabasedClient(clientDatabaseid);
                databasedClient.setUid(rs.getString("uid"));
                databasedClient.setNick(rs.getString("nick"));
                databasedClient.setLastConnect(rs.getLong("lastConnected"));
                databasedClient.setLastDisconnect(rs.getLong("lastDisconnect"));
                databasedClient.setTimeSpent(rs.getLong("timeSpent"));
                databasedClient.setLongestConnection(rs.getLong("longestConnection"));
                return databasedClient;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    return null;
}

}

我正在使用 hikari,这里是来自 AbstractStorage 的方法 class

@Override
public void execute(String query) throws SQLException {
    try (Connection connection = getConnection()){
        connection.prepareStatement(query).executeUpdate();
    }
}

@Override
public ResultSet query(String query) throws SQLException {
    try (Connection connection = getConnection()) {
        return  connection.prepareStatement(query).executeQuery();
    }
}

错误截图

我希望有人能帮助我。

我认为您看到的确切错误是由以下代码行引起的:

System.out.println("deb " + rs.getString("nick"));

您试图在将光标移动到第一条记录之前访问结果集。此外,您的方法 getDatabaseClient 正在返回一个对象,该对象在概念上映射到查询中的单个预期记录。因此,对结果集进行一次迭代似乎是有意义的。考虑到所有这些,我们可以尝试以下操作:

try {
    System.out.println("Trying to find user in db");
    ResultSet rs = fbot.getStorage().query("select * from database_name where clientDBId = " + clientDatabaseid);
    // do not access the result set here

    if (rs.next()) {
        DatabasedClient databasedClient = new DatabasedClient(clientDatabaseid);
        databasedClient.setUid(rs.getString("uid"));
        databasedClient.setNick(rs.getString("nick"));
        databasedClient.setLastConnect(rs.getLong("lastConnected"));             
        databasedClient.setLastDisconnect(rs.getLong("lastDisconnect"));
        databasedClient.setTimeSpent(rs.getLong("timeSpent"));
        databasedClient.setLongestConnection(rs.getLong("longestConnection"));
        return databasedClient;
    }
} catch (SQLException e) {
     e.printStackTrace();
}