How to retrieve the list of users based on Role Hierarchy in Salesforce: Sometimes, you need a multilevel hierarchy i.e. you need to view the individual data/reports of all the employees who are working under you. So, you need to find all the users directly under a role and its sub-roles in the role hierarchy. Here is what I have written a sample piece of code which will be easier for you to get users on the basis of the role.

Controller:

public class hierarchialInfoController{
    public Id currentUserId{get;set;} // To get the id of current User(logged-in User)
    public Id currentUserRoleId{get;set;}
    public User loggedInUser{get;set;}
    public set<Id> usersIds{get;set;}
    public hierarchialInfoController(){        
        // Get the id of the current user.        
        currentUserId = UserInfo.getUserId();
        // Get the role id of the current user.         
        currentUserRoleId = UserInfo.getUserRoleId();
        usersIds = new set<Id>();
        loggedInUser = [Select id, Name from User where Id=:currentUserId];
    }
    // Method to return the list of users on the basis of role hierarchy.
    public List<SelectOption> getUsersList() {
        List<SelectOption> userList = new List<SelectOption>();
        userList.add(new SelectOption(loggedInUser.Id,loggedInUser.Name));
        usersIds.add(loggedInUser.Id);
        // roleHierarchyUtilityClass is the utility class which returns the list of users which are below the role of Current User.
        Set<Id> allUsers = roleHierarchyUtilityClass.getRoleSubordinateUsers(currentUserRoleId); 
        for(User usr : [Select id, name from User where id =:allUsers]){
            userList.add(new SelectOption(usr.id, usr.Name));
            usersIds.add(usr.Id);
        }
        return userList;
    }
}

Helper Class:

public with sharing class roleHierarchyUtilityClass {
    public static Set<ID> getRoleSubordinateUsers(Id roleId) {
        // To get all sub roles.
        Set<Id> allSubRoleIds = getAllSubRoleIds(new Set<ID>{roleId});
        Map<Id,User> users = new Map<Id, User>([Select Id, Name From User where IsActive = True AND UserRoleId IN :allSubRoleIds]);
        return users.keySet();
    }
    
    public static Set<ID> getAllSubRoleIds(Set<ID> roleIds) {
        Set<ID> currentRoleIds = new Set<ID>();
        // Get all the roles underneath the passed roles.
        for(UserRole userRole :[select Id from UserRole where ParentRoleId IN :roleIds AND ParentRoleID != null])
            currentRoleIds.add(userRole.Id);
        if(currentRoleIds.size() > 0){
            currentRoleIds.addAll(getAllSubRoleIds(currentRoleIds));
        }
        return currentRoleIds;
    }
}

Hope this will help you a lot to understand the role hierarchy in APEX.

Thanks for reading

Hail Salesforce.