Foretag ikke det rekursive opslag i Java. Det skaleres ikke, fordi du sender masser af forespørgsler til databasen. Brug en (enkelt) rekursiv forespørgsel direkte på databasen, som vil yde og skalere meget bedre.
Du har ikke angivet dit DBMS, men rekursive forespørgsler understøttes af alle moderne databaser. Følgende er standard ANSI SQL:
with recursive ancestry as (
select child, parent, 1 as level
from users
where parent = 'Grandfather' -- this is the one who logs in
union all
select c.child, c.parent, p.level + 1
from users c
join ancestry p on p.child = c.parent
)
select child, level
from ancestry
order by level desc;
Eksempel:http://rextester.com/TJGTJ95905
Rediger efter at den rigtige database blev afsløret.
I Oracle har du to måder at gøre det på.
Den "traditionelle" måde er at bruge connect by
som er en meget mere kompakt form for en rekursiv forespørgsel end hvad SQL-standarden kom frem til:
select child, level
from users
start with parent = 'Grandfather'
connect by prior child = parent
order by level desc;
Du kunne brug også et almindeligt tabeludtryk i Oracle. Men selvom SQL-standarden kræver nøgleordet recursive
for at være obligatorisk, valgte Oracle at ignorere den del af standarden, så du er nødt til at fjerne den. LEVEL
er en pseudo-kolonne i Oracle, der kun kan bruges sammen med connect by
så dette kan ikke bruges i CTE-løsningen:
with ancestry (child, parent, lvl) as (
select child, parent, 1 as lvl
from users
where parent = 'Grandfather'
union all
select c.child, c.parent, p.lvl + 1
from users c
join ancestry p on p.child = c.parent
)
select child, lvl
from ancestry
order by lvl desc