Não faça a pesquisa recursiva em Java. Isso não será dimensionado porque você enviará lotes de consultas ao banco de dados. Use uma consulta recursiva (única) diretamente no banco de dados que terá um desempenho e uma escala muito melhores.
Você não especificou seu DBMS, mas as consultas recursivas são suportadas por todos os bancos de dados modernos. O seguinte é o padrão 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;
Exemplo:http://rextester.com/TJGTJ95905
Editar depois que o banco de dados real foi divulgado.
No Oracle você tem duas maneiras de fazer isso.
A maneira "tradicional" é usar
connect by
que é uma forma muito mais compacta de uma consulta recursiva do que o padrão SQL surgiu:select child, level
from users
start with parent = 'Grandfather'
connect by prior child = parent
order by level desc;
Você poderia use uma expressão de tabela comum no Oracle também. No entanto, embora o padrão SQL exija a palavra-chave
recursive
para ser obrigatório, a Oracle optou por ignorar essa parte do padrão, então você tem que removê-lo. LEVEL
é uma pseudo-coluna no Oracle que só pode ser usada em conjunto com connect by
então isso não pode ser usado na solução 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