Busca Avançada no hibernate + Netbeans

Pessoal estou com uma pequena dificuldade em um formulário de busca avançada no sistema que estou desenvolvendo, Pois nele eu possuo o nome, cpf, rg, bairro e etc, ai eu queria realizar uma busca no banco através do hibernate para que possa ser visualizado na tabela, eu faço a busca tudo certo pelo nome, ai vem o primeiro problema, se eu não colocar o nome completo ele não aparece, tipo eu tenho Marcelo Aurino no banco, se eu colocar apenas o Marcelo ele não mostra ninguém, ou seja, eu tenho que digitar o nome completo para que ele possa mostrar alguém. Outra coisa, os dados estão divididos, em tabelas diferentes que irei mostrar, eu estou mostrando o nome do candidato só que o telefone dele esta na tabela contato, como faço para pegar os dados dessa tabela e joga-los ao mesmo tempo que eu jogo os dados dele na tabela? a ultima pergunta, como faço para pegar os dados só dos campos que foram preenchidos e assim criar a minha query de buscar para que os dados do banco de acordo com a busca sejam mostrados?

Abaixo segue o meu CandidatoDAO com a função de buscaavancada que criei nele, essa função pega apenas o nome digitado na tela e procura ele no banco, só que tenho que digitar o nome completo se não ele diz que não tem ninguém com o determinado nome no banco.

[code]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 nome IN :nome");
       listagem_query.setParameter("nome", nomeConsulta);
       List<DadosPessoais> dps = listagem_query.list();
       ss.getTransaction().commit();
       return dps;
    }
       return null;
}    [/code]

Aqui está a minha função para popular o jtable com os dados do banco de dados através do hibernate.

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());
                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);
        }
    }

OBS: Ambos os codigos estão funcionando perfeitamente só que faltando as funções que informei logo no começo do topico.

Sei que é muita coisa pessoal, mas esotu quase acabando o sistema aqui onde trabalho só que eu sou o unico que estou desenvolvendo e não tenho com quem tirar duvidas aqui no trabalho. Desde já agradeço pela ajuda.

Muito obrigado

Não entendi o que tem a ver o NetBeans :slight_smile: Brincadeira hehe

Então, o seu problema é mais conhecimento de SQL do que qualquer outra coisa.

Pesquise sobre 2 coisas.

1 - A clausula LIKE
2 - Inner Joins

Se tiver qualquer dúvida pode postar aqui

Olá Rodrigo Sasaki

Muito obrigado pela dica dei uma estudada aqui sobre like e estou conseguindo desenrolar as consultas mas ve só estou mandando ele fazer a consulta so que ta me retornando o seguinte erro.

[code]
public void BuscaAvancaTeste() {

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

aqui é onde ta populo o jtable

[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("SELECT * FROM Candidato cand INNER JOIN Pessoa p ON (cand.id_candidato=p.id) INNER JOIN DadosPessoais d ON (p.id=d.id) WHERE upper (nome) LIKE '" + nomeConsulta +"%'");
        listagem_query.setParameter("nome", nomeConsulta);
        List<Candidato> dps = listagem_query.list();
        ss.getTransaction().commit();
        return dps;
    }

    return null;
}[/code]

mas retorna o seguinte erro

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [SELECT * FROM Modelo.Candidato cand INNER JOIN Pessoa p ON (cand.id_candidato=p.id) INNER JOIN DadosPessoais d ON (p.id=d.id) WHERE upper (nome) LIKE ‘MARCELO%’]

Vocês sabem o que é esse erro?

JPQL não tem * :slight_smile:

O negócio é meio diferente, imagine que quero buscar um funcionário, carregando também sua lista de dependentes, e filtrando pelo nome. Fica algo assim:String jpql = "SELECT f FROM Funcionario f INNER JOIN FETCH f.dependentes dependentes WHERE f.nome LIKE :nome";

O pro é esse rodrigo fiz essa consulta so que nao da certo, como estou usando o Postgres tenho esse problema :frowning:

Como você fez a consulta com os Joins? o join não precisa ter um ON em JPQL, só um alias

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

Fiz dessa forma acima e testando no JPQL ela rodou normalmente.

Mas como ficaria o ALIAS ou seria porcausa disso que estaria dando esse problema ?

Tá bom vai, uma colher de chá."SELECT c FROM Candidato c INNER JOIN c.dadosPessoais dadosPessoais"

Olá Rodrigo Sasaki
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.

[code]
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);
    }
}[/code]

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.