Führen Sie die rekursive Suche nicht in Java durch. Das wird nicht skaliert, weil Sie Lots senden werden von Anfragen an die Datenbank. Verwenden Sie eine (einzelne) rekursive Abfrage direkt in der Datenbank, die eine viel bessere Leistung und Skalierung bietet.
Sie haben Ihr DBMS nicht angegeben, aber rekursive Abfragen werden von allen modernen Datenbanken unterstützt. Folgendes ist 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;
Beispiel:http://rextester.com/TJGTJ95905
Bearbeiten nachdem die echte Datenbank offengelegt wurde.
In Oracle haben Sie zwei Möglichkeiten, dies zu tun.
Der "traditionelle" Weg ist die Verwendung von connect by
Dies ist eine viel kompaktere Form einer rekursiven Abfrage als der SQL-Standard:
select child, level
from users
start with parent = 'Grandfather'
connect by prior child = parent
order by level desc;
Sie könnten Verwenden Sie auch in Oracle einen gemeinsamen Tabellenausdruck. Allerdings verlangt der SQL-Standard das Schlüsselwort recursive
obligatorisch zu sein, hat Oracle diesen Teil des Standards ignoriert, also müssen Sie ihn entfernen. LEVEL
ist eine Pseudo-Spalte in Oracle, die nur zusammen mit connect by
verwendet werden kann daher kann dies nicht in der CTE-Lösung verwendet werden:
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