Составить SQL-запрос на основе синтаксиса WITH RECURSIVE, чтобы выборка происходила от корня к листьям.
Выполнить запрос и получившуюся выборку прогнать через рекурсивную функцию, которая построит дерево, на основе описанной структуры элемента дерева.
Наверно как-то так:
- делаем выборку всех ID в List;
- заводим пустой List;
- проходим по списку ID обязательно итератором;
- рекурсивно достаём элементы, начиная с текущего ID, условия окончания рекурсии - parentId == null . Те элементы, которые достали - удаляем из списка ID (поэтому нужен итератор, а не простой цикл).