Busca no Hibernate em Tabelas diferentes

Pessoal estou com um problema na minha busca avançada, vou dizer detalhadamente onde estou tendo esse problema.

Eu tenho o meu candidatoDAO que tem o seguinte codigo

public List BuscaAvancada(String nomeConsulta) {
        HibernateUtil hu = new HibernateUtil();
        Session ss = hu.getConexao(new Candidato());
        Transaction transacao = ss.beginTransaction();

        if (nomeConsulta != null) {
            Query listagem_query = ss.createQuery("FROM DadosPessoais WHERE upper(nome) LIKE :nome");
            listagem_query.setParameter("nome", nomeConsulta + "%");
            List<DadosPessoais> dps = listagem_query.list();
            ss.getTransaction().commit();
            return dps;
        }
        return null;
    }

nessa classe eu tenho essa função que esta chamando a query que pega todos os dados de dados pessoais.

nessa minha outra classe abaixo eu uso para popular o meu jtable pegando os dados passados pela tabela de dadospessoais

public void BuscaAvanca() {

        DefaultTableModel modelo = (DefaultTableModel) Listar.getModel();
        modelo.setNumRows(0);
        CandidatoDAO cd = new CandidatoDAO();
        try {
            if (nomeBC.getText() != null) {
                List<DadosPessoais> listaDP = cd.BuscaAvancada(nomeBC.getText().toUpperCase());
                for (DadosPessoais dp : listaDP) {
                    modelo.addRow(new Object[]{dp.getId(), dp.getNome(), dp.getIdade()});
                }
            }
        } catch (Exception erro) {
            JOptionPane.showMessageDialog(this, "Erro ao tentar listar pessoas" + erro);
        }
    }

Essa minha busca acima está funcionando perfeitamente ela retorna todos os dados da minha tabela dados pessoais e eu consigo lista-los nomeu jtable.

Agora é que vem o problema, Eu estou com a minha busca avançada, e estou precisando fazer essa busca para pegar os dados de outras tabelas també, que são endereço contato e pessoa elas estão da seguinte forma seguindo a classe do meu programa.

Meu programa tem uma classe candidato, que tem outra classe pessoa, essa pessoa tem um atributo DadosPessoais que tem todos os dados existentes na classe, como nome, idade, rg, cpf e etc. essa classe pessoa também tem um atributo endereco que pega todos os dados da classe endereco e sucessivamente na classe contato o meu problema agora é esse, como irei pegar esses dados dessas tabelas diferentes e de classes diferentes para lista-los no jtable?

Por que não busca o candidato, fazendo os joins necessários com as outras entidades?

Seu problema é de conhecimento em SQL, pois não percebe que trocando a entidade que voce faz a busca e fazendo alguns joins voce resolve isso…

estude um pouco de sql antes de prosseguir com o desenvolvimento do seu projeto

e outra coisa fuja do DefaultTableModel implemente seu proprio TableModel aqui no guj existem varios exemplos eu mesmo ja postei alguns, o defaultTableModel faz muitas coisas desnecessarias por baixo dos panos podendo ate prejudicar um pouco na perfomance do projeto, ele possui inumeros metodos alem de ter metodos sincronizados…

Ola Cristian.

Ja tentei fazer isso só que não da certo.

Olá Rodrigo

Também tentei fazer isso e continua sem dar certo :frowning:

[quote=marceloau]Ola Cristian.

Ja tentei fazer isso só que não da certo.

Olá Rodrigo

Também tentei fazer isso e continua sem dar certo :([/quote]
Que bom que tentou :slight_smile:

Agora se quer ajuda, vai ter que postar o que fez, senão não temos como fazer nada

Posto agora mesmo

Fiz da seguinte forma Fiz essa query que testei ela no postgres e alterando os nomes da tabela e arrumando as coisas pois no hibernate é diferente do postgres mas ai fiz todas as alterações e no postgres ela rodou certinho ai fiz assim ai no codigo do DAO

[code]
public List BuscaAvancada2(String nomeConsulta) {

    HibernateUtil hu = new HibernateUtil();
    Session ss = hu.getConexao(new Candidato());
    Transaction transacao = ss.beginTransaction();

    if (nomeConsulta != null) {
        Query listagem_query = ss.createQuery("FROM Candidato can INNER JOIN Pessoa pes ON (can.id_candidato = pes.id) INNER JOIN DadosPessoais dp ON(pes.id = dp.id) WHERE nome LIKE :nome");
        listagem_query.setParameter("nome", nomeConsulta + "%");
        List<Candidato> can = listagem_query.list();
        ss.getTransaction().commit();
        return can;
    }

    return null;
}[/code]

Na minha tabela para pegar os dados da lista e listar na tabela ficou da seguinte forma

[code]
public void BuscaAvancaTeste() {

    DefaultTableModel modelo = (DefaultTableModel) Listar.getModel();
    modelo.setNumRows(0);
    CandidatoDAO cd = new CandidatoDAO();
    try {
        if (nomeBC.getText() != null) {
            List<Candidato> listaCan = cd.BuscaAvancada2(nomeBC.getText().toUpperCase());
            for (Candidato can : listaCan) {
                modelo.addRow(new Object[]{can.getId(),can.getPessoa().getDadosPessoais().getNome()});
            }
        }
    } catch (Exception erro) {
        JOptionPane.showMessageDialog(this, "Erro ao tentar listar pessoas" + erro);
        System.out.println(erro);
    }
}[/code]

Lembrando que o nomeBC.getText() eh onde eu digito o nome e ele pega no banco, mas ja testei sem colocar ele somente fazendo a busca e listando os dados e nao funcionou.

e quando tento tudo isso ai em cima retorna o seguinte erro:

Fev 08, 2013 1:42:17 PM org.hibernate.hql.internal.ast.ErrorCounter reportError
ERROR: line 1:53: unexpected token: (
Fev 08, 2013 1:42:17 PM org.hibernate.hql.internal.ast.ErrorCounter reportError
ERROR: line 1:53: unexpected token: (
line 1:53: unexpected token: (
at org.hibernate.hql.internal.antlr.HqlBaseParser.fromJoin(HqlBaseParser.java:1693)
at org.hibernate.hql.internal.antlr.HqlBaseParser.fromClause(HqlBaseParser.java:1348)
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1054)
at org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:700)
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:294)
at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:157)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:266)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:105)
at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1735)
at Controle.CandidatoDAO.BuscaAvancada2(CandidatoDAO.java:95)
at Visao.Busca.BuscaAvancaTeste(Busca.java:60)
at Visao.Busca.jButton1ActionPerformed(Busca.java:335)
at Visao.Busca.access$300(Busca.java:24)
at Visao.Busca$5.actionPerformed(Busca.java:225)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:696)
at java.awt.EventQueue$4.run(EventQueue.java:694)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

Desde já agradeço pela ajuda de todos vocês.

No outro tópico que você abriu eu te mostrei um exemplo de como fazer um join, porque não usa aquele de exemplo?

eu usei só que continuou dando o mesmo erro. e também fui testar no postgres antes ela e não estava conseguindo rodar de forma alguma pesquisei na internet também em como fazer uma da mesma forma no postgres só que não tinha, era como se o postgres não tivesse entende, pois não encontrei de jeito nenhum.

Todas as consultas eu testo antes no postgres que é pra saber se elas estão rodando perfeitamente para que eu possa depois coloca-las no hibernate alterando cada uma para que fique adequadas para a linguagem dele.

Marceloau, tente trocar o createQuery por este:

    createQuery("FROM Candidato can join can.id_candidato as pessoa join pessoa.id as dp WHERE can.nome LIKE :nome");

Para que estas criterias funcionem vc precisa mapear as classes corretamente, para um melhor entendimento leia a documentação do Hibernate nesse link:
http://docs.jboss.org/hibernate/core/3.6/reference/pt-BR/html/objectstate.html

Esta documentação é do Hibernate 3.6 em ptBR

Olá Mickdark
Muito obrigado pela sua ajuda.

Consegui resolver meu problema mas foi de outra forma. Abaixo estou postando meu codigo para quem precisar ou tiver a mesma duvida que eu poder utiliza-lo, E para conseguir resolver esse problema eu tive que realizar 2 buscas no banco mas ficou da forma que eu precisava.

public void BuscaRefinada() {  
  
       DefaultTableModel modelo = (DefaultTableModel) Listar.getModel();  
       modelo.setNumRows(0);  
       CandidatoDAO cd = new CandidatoDAO();  
       try {  
           if (nomeBC.getText() != null) {  
               List<DadosPessoais> listaDP = cd.BuscaAvancadaNome(nomeBC.getText().toUpperCase());  
               for (DadosPessoais dp : listaDP) {  
                   List<Candidato> listaCan = cd.BuscaAvancadaCan(dp.getId());  
               int tamanhoLista = listaCan.size();  
           for (int i = 0; i < tamanhoLista; i++) {  
               Candidato candidato = listaCan.get(i);  
               modelo.addRow(new Object[]{candidato.getId(),dp.getNome(),candidato.getPessoa().getContato().getTelefone1(),dp.getIdade(),candidato.getPessoa().getEndereco().getBairro(),candidato.getPessoa().getFormacaoAcademica().getEscolaridade(),candidato.getPessoa().getFormacaoAcademica().getCursosSuperiores()});  
               }  
           }  
       }   
     }catch (Exception erro) {  
           JOptionPane.showMessageDialog(this, "Erro ao tentar listar pessoas" + erro);  
       }  
   }  

Acima eu estou populando o Jtable e também estou passando o id do candidato para poder buscalo na outra tabela e assim poder passar todos os dados.

Abaixo estam as 2 querys que fiz para que essa busca fosse executada

public List BuscaAvancadaNome(String nomeConsulta) {  
     HibernateUtil hu = new HibernateUtil();  
     Session ss = hu.getConexao(new Candidato());  
     Transaction transacao = ss.beginTransaction();  
  
     if (nomeConsulta != null) {  
         Query listagem_query = ss.createQuery("FROM DadosPessoais WHERE upper(nome) LIKE :nome");  
         listagem_query.setParameter("nome", nomeConsulta + "%");  
         List<DadosPessoais> dps = listagem_query.list();  
         ss.getTransaction().commit();  
         return dps;  
     }  
     return null;  
}  
  
public List BuscaAvancadaCan(long codigoDP) {  
  
     HibernateUtil hu = new HibernateUtil();  
     Session ss = hu.getConexao(new Candidato());  
     Transaction transacao = ss.beginTransaction();  
  
       
         Query listagem_query = ss.createQuery("FROM Candidato WHERE id_candidato = :id");  
         listagem_query.setParameter("id", codigoDP);  
         List<Candidato> can = listagem_query.list();  
         ss.getTransaction().commit();  
         return can;  
}  

Muito obrigado pessoal pela ajuda de vocês e se tiverem alguma duvida de como fiz isso ou em alguma coisa é só falar que explicarei sem problema algum.