I have a User table which looks like below
UserID  Name    SponsorID (FK)
1       A       null
2       B       1
3       C       1
4       D       3
The SponsorID refers to UserID. Now I need write a query which returns all user who is descendant of a given UserID.
Example
- For UserID 1 the query returns all 4 users
- For UserID 3 the query should return 1 user
The current implementation is getting the user list by looping each direct downline and I am looking for a better  solution if it's possible.
UPDATE
Current code
public void findDownlineSponsorByUserBO(UserBO rootBO) throws Exception {
    List<UserBO> downlines = businessOperationService.findUserBySponsorId(rootBO.getId(), "createdDate", false);
    memberList.addAll(downlines);
    for (UserBO memberBO : downlines) {
        findDownlineSponsorByUserBO(memberBO);
    }
}
 
     
    