Tabela auto-relacionada

1 resposta
R

Pessoal, estou tendo dificuldades em fazer o seguinte procedimento?
Eu tenho uma tabela auto-relacionada, onde cada registro filho(linha) possui um identificador do registro pai (se houver, ele pode ser simplesmente PAI.).
eu quero montar uma lista da seguinte forma

<li>1
   <ul>
       <li>1.1</li>
       <li>1.2</li>
       <li>1.3
          <ul>
             <li>1.3.1</li>
           </ul>
       </li>
   </ul>
</li>
<li>2</li>

Alguém pode me ajudar a estruturar uma função para eu varrer o banco e mostrar a lista desta forma?
Com esse resultado eu vou jogar no jquery para fazer uma árvore.

Att,

1 Resposta

R

Resolvido da seguinte forma

1-Primeiro recupera apenas os pais que não são filhos.
2-Carrego todos os filhos em memória (list_servicos_filhos);

List<TbServico> list_servicos_filhos = new ArrayList();

	public String montaListaServicos(){
		Session session;
		StringBuffer arvore = new StringBuffer();
		UtilitarioHibernate.beginTransaction();
		session = UtilitarioHibernate.getSession();
		Criteria criteria = session.createCriteria(TbServico.class);
		criteria.add(Restrictions.isNull("tbServico"));
		
		Criteria criteriaFilhos = session.createCriteria(TbServico.class);
		criteriaFilhos.add(Restrictions.isNotNull("tbServico"));
		list_servicos_filhos = criteriaFilhos.list();
		//recupera todos os pais raiz
		List<TbServico> srvs_pais = criteria.list();
		for (TbServico servico : srvs_pais) {
			//ADCIONA O PAI NA ARVORE
			arvore.append("<li><a onclick='javascript:gravaValor("+servico.getIdServico() +")'>"+servico.getNomServico()+"</a>");
			arvore.append(filhos(servico.getIdServico()));
		
			
		}
		return arvore.toString();
	}

Agora que vem a mágica (tecnologia)

3 - Uma funcão recursiva vai montando a árvore, caso não tenha mais níveis ela retorna o próprio fechamento da tag ()

public String filhos(Integer idPai){
		
		StringBuffer s = new StringBuffer();
		for (TbServico filho : list_servicos_filhos) {
			if(filho!=null){
				if(filho.getTbServico().getIdServico() == idPai){
					s.append("<ul>");
					s.append("<li><a onclick='javascript:gravaValor("+filho.getIdServico() +")'>"+filho.getNomServico()+"</a>");
					s.append(filhos(filho.getIdServico()));
					s.append("</ul>");
					
				}
	
			}
		}
Criado 23 de março de 2009
Ultima resposta 23 de mar. de 2009
Respostas 1
Participantes 1