Eu faria logo na selecção dos dados. Retornaria Map<Integer, List> em vez de um ArrayList. A chave do mapa seria o pai, e a lista conteria todos os filhos.
pmlm: eu faria duas collections, porque usando jstl ou facelets, poderia usar o c:forEach ou ui:repeat encadeados, com um Map não seria possível isso.