Gör inte den rekursiva sökningen i Java. Det kommer inte att skalas eftersom du kommer att skicka massor av frågor till databasen. Använd en (enkel) rekursiv fråga direkt på databasen som kommer att prestera och skala mycket bättre.
Du angav inte din DBMS men rekursiva frågor stöds av alla moderna databaser. Följande är 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;
Exempel:http://rextester.com/TJGTJ95905
Redigera efter att den verkliga databasen avslöjades.
I Oracle har du två sätt att göra det.
Det "traditionella" sättet är att använda connect by
vilket är en mycket mer kompakt form av en rekursiv fråga än vad SQL-standarden kom fram till:
select child, level
from users
start with parent = 'Grandfather'
connect by prior child = parent
order by level desc;
Du kunde använd ett vanligt tabelluttryck i Oracle också. Men även om SQL-standarden kräver nyckelordet recursive
för att vara obligatorisk valde Oracle att ignorera den delen av standarden, så du måste ta bort den. LEVEL
är en pseudo-kolumn i Oracle som endast kan användas tillsammans med connect by
så detta kan inte användas 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