Fazer uma busca no banco de dados(utilizando hibernate), buscando dois atributos

6 respostas
L

Amigos,

quero fazer uma busca no meu banco de dados, porem quero que essa busca me retorne dois atributos da classe buscada, que são os atributos Descricao e CodigoIBGE. Eu somente sei fazer buscando um atributo e mesmo assim se este for java.lang.String(caso do atributo descricao) e o atributo CodigoIBGE é do tipo int.

segue abaixo meu codigo, faltando buscar o atributo do CodigoIBGE que é do tipo int.
try{
        if (TxtDescricao.getText().equals("")) {
        JOptionPane.showMessageDialog(this, "Nome da Cidade não informada.Favor completa-lo" );
        }
        else{
            TxtDescricao.requestFocusInWindow();
            TxtCodigo.setText(null);
            TxtCodigo.setEnabled(false);
            SessionFactory sfac = new Configuration().configure().buildSessionFactory();
            Session se = sfac.openSession();
            Transaction tx = se.beginTransaction();
            Query sql = se.createQuery("from Cidade where Descricao = (?)")
                    .setString(0,TxtDescricao.getText().toUpperCase()); 
            Cidade teste = (Cidade) sql.uniqueResult();            
        }
    }
    catch(Exception erro){
        
    }

6 Respostas

F

Não entendi muito bem o que vc pretende fazer?
Vc esta querendo pegar a descrição de uma cidade e passa como parametro a descrição? Não seria o nome da cidade?
Se essa estrutura é uma peculiaridade do hibernate, esqueça o que eu acabei de perguntar porque eu ainda não estudei essa Framewoks.

C

Fala Luiz Gustavo, tudo na paz?
Vê se serve pra ti, este exemplo:

Query select = se.createQuery("from Cidade where Descricao = :descricao and CodigoIBGE = :codigoIbge");
select.setString("descricao", TxtDescricao.getText().toUpperCase()); 
select.setInteger("codigoIbge", Integer.parseInt(TxtCodigoIBGE.getText()));

Qualquer coisa é só falar :wink:

L

Carlos, pelo q eu vi, eu consigo pegar os atributos Descricao(que é o nome) e o CodigoIBGE
mas eu naum estou conseguindo agora é fazer o select.getDescricao e o select.getCodigoIBGE

naum estou conseguindo fazer as comparações que eu preciso, conforme codigo abaixo
os gets dos if é que faltam completa…tentei todas as opções que o netbeans fornece, mas nenhuma deu certo…

try{
        if (TxtDescricao.getText().equals("")) {
        JOptionPane.showMessageDialog(this, "Nome da Cidade não informada.Favor completa-lo" );
        }
        else{
            TxtDescricao.requestFocusInWindow();
            TxtCodigo.setText(null);
            TxtCodigo.setEnabled(false);
            SessionFactory sfac = new Configuration().configure().buildSessionFactory();
            Session se = sfac.openSession();
            Transaction tx = se.beginTransaction();
            Query select = se.createQuery
                    ("from Cidade where Descricao = :descricao and CodigoIBGE = :codigoIbge");
            select.setString("descricao", TxtDescricao.getText().toUpperCase());
            select.setInteger("codigoIbge", Integer.parseInt(TxtCodigoIBGE.getText()));

            try{
                if((TxtDescricao.getText().toUpperCase().equals(select.get()))  // ---------->>aqui ocorre o meu problema.....naum estou sabendo fazer essa igualdade
                        || TxtCodigoIBGE.getText().equals(select.get())){
                     JOptionPane.showMessageDialog(this,"deu certo");
                }
                else{
                    JOptionPane.showMessageDialog(this,"deu errado");
                }

            }
            catch(Exception erro){

            }
        }
    }
    catch(Exception erro){

    }

amigo, agradeço pela ajuda

obrigado

marcos1EM

Cara eu n entendi muito bem pq vc esta tentando buscar o codIBGE e a descrição sendo q vc esta passando eles como parametro… mas td bem, quando vc quer buscar campos especificos o HQL retorna um List<Object[]> sendo assim basta percorrer a lista retornada e converter cada valor para o seu devido tipo de acordo com o tipo do campo q será retornado, so pra vc ter uma ideia acho q a sua consulta poderia ser feita assim:

List<Object[]> listCampos = se.createQuery("SELECT" + " c.c.Descricao," + // posição 0 "c.CodigoIBGE " + // posição 1 " from Cidade c" + " where c.Descricao = :descricao and c.CodigoIBGE = :codigoIbge").setString("descricao", param).setInteger("codigoIbge", param).list(); for (Object[] ob : listCampos) { //Pegando os valores retornados String desc = (String) ob[0]; Integer cod = (Integer) ob[1]; }

C

Luiz Gustavo,
você não pega os resultados como você descreveu:

select.getDescricao //Forma errada
select.getCodigoIBGE //Forma errada

Você manipula assim:

Cidade cid = (Cidade) sql.uniqueResult(); //Retorna o objeto,

if((TxtDescricao.getText().toUpperCase().equals( cid.getString("Descricao") )) {
   //Faz a ação
}

Geralmente, eu faço as pesquisas usando o LIKE, e o retorno é uma lista de objetos,
“from Cliente as cliente where upper(cliente.nome) like :nome order by cliente.nome”
Aqui estou usando um iterator, mas pode usar um for também, como o Marcos descreveu.

java.util.List objetos = new java.util.Vector();

ClienteDao clientedao = new ClienteDao();

objetos = clientedao.findByNome(tfNome.getText());

java.util.Iterator <persistencia.Cliente> ClienteIter = objetos.iterator();

DefaultTableModel model = (DefaultTableModel) jTableCliente.getModel();
model.setRowCount(0);

while (ClienteIter.hasNext()) {
   persistencia.Cliente cliente = ClienteIter.next();
   java.util.Vector vetor1 = new java.util.Vector();
   vetor1.addElement(cliente.getCodigo());
   vetor1.addElement(cliente.getNome());
   vetor1.addElement(cliente.getNomeFantasia());
   vetor1.addElement(cliente.getCpfCnpj());
   model.addRow(vetor1);
}

clientedao.getSession().close();

Aqui o codigo do clienteDao:
obs: Leia sobre DAO e Factory,
aqui to usando somente DAO.

package estoque.cliente;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import persistencia.Cliente;
import persistencia.HibernateUtil;

public class ClienteDao {
    private Session session;
    private Transaction tr;

    public Session getSession() {
       if (session == null)
           session = HibernateUtil.getSessionFactory().openSession();
       return session;
    }

    public void begin() {
        tr = getSession().beginTransaction();
    }

    public void commit() {
        tr.commit();
    }

    public void rollback() {
        tr.rollback();
    }

    public List<Cliente> findByNome(String nome) {
        Query select = getSession().createQuery("from Cliente as cliente where upper(cliente.nome) like :nome order by cliente.nome");
        select.setString("nome", "%"+ nome.toUpperCase()+"%");
        
       return select.list();
    }

    public Cliente get(int id) {
        return (Cliente) getSession().get(Cliente.class, id);
    }

    public void save(Cliente cl) {
        getSession().save(cl);
        session.flush();
    }

    public void update(Cliente cl) {
        getSession().update(cl);
        session.flush();
    }

    public void delete(Cliente cl) {
        getSession().delete(cl);
    }

}
L

Senhores, muito obrigado pela ajuda…

vou testar aqui e aviso quando resolver!!!

muito obrigado gente!!!

Criado 19 de julho de 2010
Ultima resposta 23 de jul. de 2010
Respostas 6
Participantes 4