Consultas usando HQL

5 respostas
I

Olá a todos,

Preciso de uma ajuda na criação de consultas usando o HQL e o criteria se for o caso.

Tenho uma tabela 1:N como segue:

Tabela Pessoa
idpessoa (PK), nome, data_cadastro

Tabela Telefone
idtelefone(PK), ddd, fone, idpessoa(FK)

Eu consigo consultar o objeto pessoa e recuperar os atributos conforme o exemplo abaixo:

Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        s.beginTransaction();               
        List<Pessoa> lista = (List<Pessoa>)s.createQuery("from Pessoa").list();
         
        for(Pessoa p : lista){
            System.out.println("Código: " + p.getIdpessoa());
            System.out.println("Nome: " + p.getNome());   
        }
  1. O problema é: como faço para exibir os telefones que pertencem a essa pessoa?
  2. Eu não estou usando nenhum Annotations para realizar as consultas. Isso esta correto mesmo?

Eu preciso de ajuda na criação da Query em HQL e depois na hora de recuperar as informações através do objeto Pessoa ou Telefone.
To perdido ai…

Alguém por favor pode me ajudar.
Grato.

5 Respostas

tveronezi

Veja: http://docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html

Depois é só fazer:

for(Pessoa p : lista){  
    System.out.println("Código: " + p.getIdpessoa());  
    System.out.println("Nome: " + p.getNome());     
    for(Telefone t : p.getTelefones()){  
        System.out.println("Telefone: (" + t.getDdd() + ") " + t.getFone());  
    }
}
I

tveronezi:
Veja: http://docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html

Depois é só fazer:

for(Pessoa p : lista){ System.out.println("Código: " + p.getIdpessoa()); System.out.println("Nome: " + p.getNome()); for(Telefone t : p.getTelefones()){ System.out.println("Telefone: (" + t.getDdd() + ") " + t.getFone()); } }

Olá tveronezi

Deu certo alterando um pouco seu código, pois o objeto telefone estava setado por hashset, dai a forma de obter os valores é um pouquinho diferente.
Eu não precisei usar os Annotations do link que você me passou, pois estou usando o XML. Vou continuar testando as coisas por aqui e se for preciso, uso o Annotations.

CARA MUITO OBRIGADO…

Procurei isso e não achei em lugar nenhum…

Segue o código:

for(Pessoa p : lista){
            System.out.println("Código: " + p.getIdpessoa());
            System.out.println("Nome: " + p.getNome());
            for (Iterator it = p.getTelefones().iterator(); it.hasNext();) {
                Telefone t = (Telefone) it.next();
                System.out.println("Telefone: (" + t.getDdd() + ") " + t.getFone());
            }                       
        }

Última dúvida, daqui pra frente eu posso fazer os métodos para agirem diretamente nas query(s), usar join e só mostrar o que eu quero ali destro do list, certo?

tveronezi

Fico contente por saber que deu certo.

Só um detalhe: O loop…

for(Telefone t : p.getTelefones()){    
  System.out.println("Telefone: (" + t.getDdd() + ") " + t.getFone());    
}

Funciona pra qualquer objeto que implemente “Collection”. Ou seja, funciona pra “List” e pra “Set”. Você não precisa usar Iterators, a não ser que realmente queira isso.

I

Da forma como você passou estava com erro…por isso que comecei a usar o Iterators.

Eu usei o wizard do netbens para gerar os beas, xml, conf e mapeamentos.

No beans ele cria desta forma:

public class Pessoa  implements java.io.Serializable {
     private Integer idpessoa;
     private String nome;
     private Date dataCadastro;
     private Set telefones = new HashSet(0);
     private Set usuarios = new HashSet(0);
     private Set enderecos = new HashSet(0);

     public Pessoa() {
     }
...gettes e setters
public class Telefone  implements java.io.Serializable {
     private Integer idtelefone;
     private Pessoa pessoa;
     private Integer ddd;
     private Integer fone;
 
     public Telefone() {
     }
...gettes e setters

Repare que dentro da classe Telefone ele criou um objeto Pessoa (pessoa).
E dentro da Classe Pessoa ele criou o Set telefones = new HashSet(0);

Por isso que eu só consigo recuperar usando Iterators não é?

tveronezi

Dá uma olhada neste junit…

public class TestMe {
    private static final Collection<Integer> NUMBERS;

    static {
        final List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        Collections.shuffle(myList);

        NUMBERS = Collections.unmodifiableCollection(myList);

        System.out.println("NUMBERS -> " + NUMBERS);
    }

    private void iterate(Collection<Integer> myCollection) {
        System.out.println("");

        if (myCollection != null) {
            System.out.print(myCollection.getClass().getSimpleName());
            myCollection.addAll(NUMBERS);
        }

        for (Integer element : myCollection) {
            System.out.print(" - " + element);
        }
    }

    @Test
    public void testMe() throws Exception {
        iterate(new HashSet<Integer>());
        iterate(new ArrayList<Integer>());
        iterate(new LinkedList<Integer>());
        iterate(new PriorityQueue<Integer>());

        try {
            iterate(null);
            Assert.fail("Deveria ter um nullpointer aqui.");
        } catch (NullPointerException e) {
            //expected!
        }
    }
}
Criado 20 de julho de 2012
Ultima resposta 21 de jul. de 2012
Respostas 5
Participantes 2