Retornar consulta do banco de vários campos com jquery.[RESOLVIDO]

Bom dia pessoa gostaria de saber como que eu faço para retornar mais que um campo passando o código como paramentro.

abaixo o código que uso para retornar um campo, com vraptor e jquery, eu passo o codigo da pessoa e retorna o nome, gostaria de saber com faço para retornar o nome e cpf, por exemplo.

Jquery


function getPessoa(){
  
    $.get("/Coliseu/buscaPessoa/busca?idpessoa="+$("#idpessoa").val(), function(data){
        $('#pessoanome').val(data);
    });   
}

PessoaController

    @Get
    @Restrito
    @Path("/buscaPessoa/busca")
    public void buscaPessoa(Integer idpessoa) {
        result.use(Results.http()).body(dao.getPessoas(idpessoa));

    }

PessoaDao

public String getPessoas(Integer idpessoa) {
        Session session = Hibernate.getSession();
        String nome = null;

        Criteria criteria = null;

        try {
            criteria = session.createCriteria(Pessoa.class).add(Restrictions.eq("idpessoa", idpessoa)).setProjection(Projections.property("nome"));
            criteria.uniqueResult();
            if (criteria.uniqueResult() == null) {
                nome = "Nao cadastrado";
            } else {
                nome = criteria.uniqueResult().toString();
            }
        } catch (HibernateException hibernateException) {
            nome = "Sem acesso verifique conexão";
        }
        return nome;
    }

vc pode retornar uma lista de Strings, (ou uma lista de qqer outra coisa)

e fazer:

result.use(json()).from(lista, "nomeDela").serialize();

e vc acessa via javascript como json

Fiz exemplo utilizando cidade, ele chama o metodo do dao, e faz a consulta e tal, só que não retorna nada, acho que estou esquecendo de algo, ou não estou fazendo certo, poderia dar uma olhada e ver o que estou errando fazendo o favor.

Cidadecontroller

    @Get
    @Restrito
    @Path("/buscaCidade/busca")
    public void buscaCidade(String idcidade) {
        result.use(Results.json()).from(dao.getCidades(idcidade), "Resultado").serialize();
    }

javascript

function getCidade() {

    $.get("/Coliseu/buscaCidade/busca?idcidade="+$("#idcidade").val(), function(){
        $("#cidadenome").val(Resultado["cidade.cidade"]);
        $("#uf").val(Resultado["cidade.uf.siglauf"]);
    });

}

CidadeDao

 public List<Cidade> getCidades(String idcidade) {
        Session session = Hibernate.getSession();
        List<Cidade> list = null;
        Criteria criteria = null;

        try {
            criteria = session.createCriteria(Cidade.class).add(Restrictions.eq("idcidade", idcidade));
            criteria.uniqueResult();
            list = criteria.list();
            if (criteria.uniqueResult() == null) {
                list = null;
            }
        } catch (HibernateException hibernateException) {
             list = null;
        }finally{
            session.close();
        }
        return list;
    }

no javascript, vc tem que receber o que o controller retornou. Vc pode usar o $.getJSON:

$.getJSON("/Coliseu/buscaCidade/busca", {idcidade :  $("#idcidade").val()}, function(json){  
        $("#cidadenome").val(json.Resultado.cidade.cidade);  
        $("#uf").val(json.Resultado.cidade.uf.siglauf);  
    });  

ou algo do tipo

cara não deu certo ele dá essa mensagem no navegador (Uncaught TypeError: Cannot read property ‘cidade’ of undefined)


$.getJSON("/Coliseu/buscaCidade/busca", {idcidade :  $("#idcidade").val()}, function(json){
        $("#cidadenome").val(json.listcidade.cidade.cidade);
        $("#siglauf").val(json.listcidade.cidade.uf.siglauf);
    });
}
 @Get
    @Restrito
    @Path("/buscaCidade/busca")
    public void buscaCidade(String idcidade) {
        result.use(Results.json()).from(dao.getCidades(idcidade), "listcidade").serialize();
    }


dê um console.dir(json) e veja o que aparece (no Firebug)

no console do chrome aparece o seguinte:


Uncaught TypeError: Cannot read property 'cidade' of undefined
(anonymous function)funcoes.js:302
bjquery.js:2642
c.extend.ajax.g.x.onreadystatechange

chama a uri: “/Coliseu/buscaCidade/busca?idcidade=111” na mão e vê qual é a resposta

eu passei isso


http://localhost:8084/Coliseu/buscaCidade/busca?idcidade=1100015

e retornou isso

{"listcidade": [
  {
    "idcidade": "1100015",
    "cidade": "Alta Floresta D'Oeste"
  }
]}

vc queria que retornasse mais de uma cidade mesmo?

o problema é que json.listcidade é um array…

então vc deveria fazer algo do tipo:

json.listcidade[0].cidade

para acessar o dado correto.

Eu quero que ele retorne somente uma cidade, tipo eu quero o seguinte tem 3 campos, o idcidade, cidade e a uf, se o usuário souber o idcidade, ele informa, e através do json, faz a consulta e retorna a cidade, e a uf, caso não encotre vai retornar no cidade, não encontrado.

ok, então vc não deveria serializar uma lista, e sim um objeto que tenha como atributos o nome da cidade e o uf. e vc pode usar o withoutRoot:

Cidade cidade = carregaACidade(idcidade);
result.use(json()).withoutRoot().from(cidade).serialize();

e no javascript:

$.getJSON(...., function(cidade) {
       cidade.cidade
       cidade.uf
})

Deu certo, só que eu tenho a tabela cidade, e uf, ele trás o nome da cidade mas não a uf, o que eu preciso fazer para retornar a uf também:


function getCidade() {

$.getJSON("/Coliseu/buscaCidade/busca", {idcidade :  $("#idcidade").val()}, function(cidade){
        $("#cidadenome").val(cidade.cidade);
        $("#siglauf").val(cidade.cidade.uf.siglauf);
    });
}

CidadeController

    @Get
    @Restrito
    @Path("/buscaCidade/busca")
    public void buscaCidade(String idcidade) {
        Cidade cidade = dao.getCidades(idcidade);
        result.use(Results.json()).withoutRoot().from(cidade).serialize();
    }

CidadeDao


    public Cidade getCidades(String idcidade) {
        Session session = Hibernate.getSession();
        Criteria criteria = null;
        Cidade cidade = new Cidade();
        try {

             criteria = session.createCriteria(Cidade.class).setFetchMode("uf", FetchMode.JOIN).add(Restrictions.eq("idcidade", idcidade));

            if (criteria.uniqueResult() == null) {
                criteria = null;
            }

             cidade = (Cidade) criteria.uniqueResult();
        } catch (HibernateException hibernateException) {
             criteria = null;
        }finally{
            session.close();
        }
        return cidade;
    }

adicione um recursive():

result.use(Results.json()).withoutRoot().from(cidade).recursive().serialize();

por padrão o VRaptor só serializa os tipos primitivos (strings, numeros e datas), daí os outros campos precisam ser incluidos via include ou recursive pra incluir tudo

Agora ele não retorna nada no campo do formulário, e quando faço na mão: http://localhost:8084/Coliseu/buscaCidade/busca?idcidade=1100015 retorna :

{
  "uf": {
    "uf": "11",
    "nomeuf": "Rondônia",
    "paissigla": "BR",
    "siglauf": "RO",
    "tribestadosCollection": [
      false,
      {
        "@class": "uf"

a unica mudança que fiz foi essa:

    @Get
    @Restrito
    @Path("/buscaCidade/busca")
    public void buscaCidade(String idcidade) {
        Cidade cidade = dao.getCidades(idcidade);
        result.use(Results.json()).withoutRoot().from(cidade).recursive().serialize();
    }

não bom, faça isso então:

result.use(Results.json()).withoutRoot().from(cidade).include("uf").serialize();

por isso q eu não gosto de usar recursive :stuck_out_tongue:

Deu certo Lucas, muito obrigado você já me ajudou um várias vezes valew mesmo.

segue como fincou:

Controller

   @Get
    @Restrito
    @Path("/buscaCidade/busca")
    public void buscaCidade(String idcidade) {
        Cidade cidade = dao.getCidades(idcidade);
        result.use(Results.json()).withoutRoot().from(cidade).include("uf").serialize();
    }

javascript

function getCidade() {

$.getJSON("/Coliseu/buscaCidade/busca", {idcidade :  $("#idcidade").val()}, function(cidade){
        $("#cidadenome").val(cidade.cidade);
        $("#siglauf").val(cidade.uf.siglauf);
    });
}