Ne faites pas la recherche récursive en Java. Cela ne sera pas évolutif, car vous enverrez des lots de requêtes à la base de données. Utilisez une (seule) requête récursive directement sur la base de données qui sera beaucoup plus performante et évolutive.
Vous n'avez pas spécifié votre SGBD, mais les requêtes récursives sont prises en charge par toutes les bases de données modernes. Voici le SQL ANSI standard :
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;
Exemple :http://rextester.com/TJGTJ95905
Modifier après la divulgation de la vraie base de données.
Dans Oracle, vous avez deux façons de le faire.
La méthode "traditionnelle" consiste à utiliser connect by
qui est une forme beaucoup plus compacte d'une requête récursive que ce que le standard SQL a proposé :
select child, level
from users
start with parent = 'Grandfather'
connect by prior child = parent
order by level desc;
Vous pourriez utilisez également une expression de table commune dans Oracle. Cependant même si la norme SQL requiert le mot clé recursive
pour être obligatoire, Oracle a choisi d'ignorer cette partie de la norme, vous devez donc la supprimer. LEVEL
est une pseudo-colonne dans Oracle qui ne peut être utilisée qu'avec connect by
cela ne peut donc pas être utilisé dans la solution 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