Не правете рекурсивното търсене в Java. Това няма да се мащабира, защото ще изпращате партии на заявки към базата данни. Използвайте (единична) рекурсивна заявка директно в базата данни, която ще работи и ще мащабира много по-добре.
Не сте посочили вашата СУБД, но рекурсивните заявки се поддържат от всички съвременни бази данни. Следното е стандартен 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;
Пример:http://rextester.com/TJGTJ95905
Редактиране след разкриването на истинската база данни.
В Oracle имате два начина да направите това.
"Традиционният" начин е да използвате connect by
което е много по-компактна форма на рекурсивна заявка от това, което създаде стандартът SQL:
select child, level
from users
start with parent = 'Grandfather'
connect by prior child = parent
order by level desc;
Вие можете използвайте и общ табличен израз в Oracle. Въпреки това, въпреки че стандартът на SQL изисква ключовата дума recursive
за да бъде задължително, Oracle избра да игнорира тази част от стандарта, така че трябва да я премахнете. LEVEL
е псевдоколона в Oracle, която може да се използва само заедно с connect by
така че това не може да се използва в 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