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