Neprovádějte rekurzivní vyhledávání v Javě. To se nezmění, protože budete posílat množství dotazů do databáze. Použijte (jediný) rekurzivní dotaz přímo na databázi, který bude fungovat a škálovat mnohem lépe.
Nezadali jste svůj DBMS, ale rekurzivní dotazy jsou podporovány všemi moderními databázemi. Následuje standardní 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;
Příklad:http://rextester.com/TJGTJ95905
Upravit poté, co byla odhalena skutečná databáze.
V Oracle to můžete udělat dvěma způsoby.
"Tradičním" způsobem je použití connect by
což je mnohem kompaktnější forma rekurzivního dotazu než to, s čím přišel standard SQL:
select child, level
from users
start with parent = 'Grandfather'
connect by prior child = parent
order by level desc;
Mohli byste používat běžný tabulkový výraz i v Oracle. I když však standard SQL vyžaduje klíčové slovo recursive
aby byla povinná, Oracle se rozhodl tuto část standardu ignorovat, takže ji musíte odstranit. LEVEL
je pseudosloupec v Oracle, který lze použít pouze společně s connect by
takže to nelze použít v řešení CTE:
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