Você precisa usar:
preparedStatement.executeQuery();
ao invés de
preparedStatement.executeQuery(login);
quando você passa uma string para
executeQuery() que consulta é executada literalmente e, portanto, o ? é enviado para o banco de dados que cria o erro. Ao passar a string de consulta, você não está executando a instrução preparada "em cache" para a qual você passou os valores.