Referência Circular

Bom dia,
Tenho uma classe que monta o organograma da empresa.
A classe organograma é composta pelos atributos id, nome e idPai.
Gostaria de criar um método onde eu passasse o idPai como parâmetro e me retornasse toda a hierarquia desse pai, ou seja, filhos, netos, bisnetos … Nnetos.

Obrigado.

Por favor seja mais específico na sua dúvida.

Você quer, à partir de um nó, retornar todos abaixo dele, é isso?
Como você quer fazer este retorno, em forma de um novo organograma?

Não sou um grande conhecedor de organogramas, mas acho que eles tem comportamento semelhantes à árvores, não tem?
Sugiro que você procure por algoritmos para impressão manipulação de árvores (da área de estruturas de dados).

Hum… id, nome e idPai é coisa de banco de dados. Vou ignorar isso por enquanto

Aparentemente vc tem (ou pode ter) algo como

class Pessoa { private long id; private String nome; private Pessoa pai; /* isso é java */ /* construtor e métodos getters */ }

Agora, se vc quer toda uma hierarquia a partir de uma pessoa, ao meu ver vc teria que criar uma arvore usando algum algoritmo recursivo-descendente.

Se vc tiver uma lista de pessoas, vc pode usar o pseudoalgoritmo abaixo:

[code]Pessoa principal = new Pessoa(parametros);
List lista = QQcoisa.getListaPessoas();

List listaDaquelaHierarquia = new ArrayList();
for(Pessoa pessoa : lista){
if(pessoa.isFilho(principal)){
listaDaquelaHierarquia.add(pessoa);
}
}[/code]

Isso traria os filhos. Para isso isFilho(candidato) deve ser algo como

public boolean isFilho(Pessoa candidato){ return this.pai != null && this.pai.equals(candidato); }

Para pegar toda a hierarquia vc pode fazer isso N vezes (recursivamente) ou vc pode apelar para estruturas de dados mais interessantes (como montar uma arvore baseado em quem é pai de quem e, então, pegar um ramo da arvore).

É claro que, se isso reflete o banco de dados e vc quer fazer isso via SQL ou Hibernate, vc tem varias opções para realizar o que vc quer. Por exemplo, no Oracle, vc tem a clausula “Connected By”, para dados desse tipo (tipico de bancos hierarquicos).

mmm… many to many

class Pessoa {
    private int id;
    private String nome;
    private Pessoa superior;
    private Set<Pessoa> subordinados;
}

claro, seria bom um atributo para identificar a posição hierárquica da criatura.

Vai que tem um iluminado que tenta pendurar um gerente como subordinado de um peão.

[quote=engfelipeoliveira]Bom dia,
Tenho uma classe que monta o organograma da empresa.
A classe organograma é composta pelos atributos id, nome e idPai.
Gostaria de criar um método onde eu passasse o idPai como parâmetro e me retornasse toda a hierarquia desse pai, ou seja, filhos, netos, bisnetos … Nnetos. [/quote]

  1. Esta estrutura de dados está mapeada em um ORM?

  2. Você está querendo saber “como seria se fosse”?

  3. A estrutura de dados já está montada aquequadamente, vc quer saber apenas como percorrer a alista?

flws

Com essa estrutura seria meio complicado achar todos os filhos de um mesmo pai…já que o nó só tem referência para o pai, e não tem referência para uma lista de filhos…Só consico percorrer das folhas para a raiz… Ou estou errado??

Fernando

Com a estrutura enviada pelo Z, consegue-se (através de subordinados):

class Pessoa {  
     private int id;  
     private String nome;  
     private Pessoa superior;  
     private Set<Pessoa> subordinados;  
}  

OK pessoal.
Seguindo a linha do Oracle, montei a seguinte query:

SELECT x.lota_nm_lotacao FROM tb_lotacao x CONNECT BY PRIOR x.id_lotacao=x.id_unidade_pai START WITH x.id_unidade_pai = parametro ORDER SIBLINGS BY x.lota_nm_lotacao

Está me retornando exatemente o que eu quero.
A minha dúvida é, como transformar isso em uma query para o hibernate?

public List<LotacaoEntity> recuperaFilhos() throws Exception { try{ Session sess = PlcHibernateManagerLocator.getInstance().getHibernateManagerClasse("default").getSession(); return sess.createQuery(" from LotacaoEntity obj ") .list(); }catch (Exception e) { } }

Acredito que ao mapear as entidades vc terá como resultado a lista com as associações corretas.

É claro que, se vc quiser incluir as informações desta entidades em algum objeto visual vc deverá fazer uma leitura recursiva na lista resultante.

flws

Aproveitando, como eu mapearia com o hibernate a classe Pessoa?