package jm28;

import java.util.*;

import org.hibernate.*;
import org.hibernate.cfg.*;

public class ListaCategoriasMunicipio {
    
    public static void main(String[] args) {

        SessionFactory sessionFactory =
            new Configuration().configure().buildSessionFactory();
            
        Session session = sessionFactory.openSession();
            
        Transaction tx = session.beginTransaction();
        
        Query query = session.createQuery(
            "select cat from Categoria as cat " +
            "join fetch cat.clientes cli " +
            "where cli.endereco.municipio = 'Gothan City' " +
            "order by cat.nome");
        /* uma forma de resolver o problema da duplicação
        SortedSet<Categoria> categorias = new TreeSet<Categoria>(
            new Comparator<Categoria>() {
                public int compare(Categoria o1, Categoria o2) {
                    return o1.getNome().compareTo(o2.getNome());
                }
            }
        );
        categorias.addAll(query.list());
        Iterator<Categoria> it = categorias.iterator();
        while (it.hasNext()) {
        */
        /* outra forma de resolver a duplicação */
        Iterator<Categoria> it = query.list().iterator();        
        Categoria anterior = null;
        while (it.hasNext()) {
            Categoria cat = it.next();
            if (cat != anterior) {
                System.out.println("[" + cat.getId() + "] "
                    + cat.getNome());
                Iterator<Cliente> it2 = cat.getClientes().iterator();    
                while (it2.hasNext()) {
                    Cliente cli = it2.next();
                    System.out.println("\t[" + cli.getId() + "] "
                        + cli.getNome());
                }
            }
            anterior = cat;
        }
        
        tx.commit();
        
        session.close();
    }
    
}
