Olá pessoal, td bem??
É o seguinte: quero montar uma criteria mais ou menos assim:
@SuppressWarnings("unchecked")
public List<Respostas> getRespostasByPergunta(Long id) {
Criteria c = session.createCriteria(Respostas.class);
List<Respostas> results = c.createCriteria("pergunta").add(
Restrictions.eq("cod_pergunta", id)).list();
return results;
}
Só que na verdade, eu quero que através dessa criteria, me sejam exibidas apenas os itens que tem o relacionamento com o item X, ou seja:
Em se falando de perguntas e respostas, digamos que eu queira que me sejam exibidas apenas as respostas referentes a pergunta 1, entenderam??
Como tenho muito pouco conhecimento de criteria, gostaria de uma ajuda, se possível.
Supondo que sua classe Resposta tenha uma referência para a Pergunta, assim:
Pergunta pergunta = new Pergunta();
pergunta.setId(id);// seta o id da pergunta aqui, e depois passa ela pro Criteria:
List<Respostas> results = c.add(Restrictions.eq("pergunta", pergunta)).list();
Kleber-rr
marcelo.bellissimo:
Supondo que sua classe Resposta tenha uma referência para a Pergunta, assim:
Pergunta pergunta = new Pergunta();
pergunta.setId(id);// seta o id da pergunta aqui, e depois passa ela pro Criteria:
List<Respostas> results = c.add(Restrictions.eq("pergunta", pergunta)).list();
Pois é man, mas tipo assim: eu tenho cadastradas, por exemplo, as perguntas 1 e 2
eu quero que me apareçam somente as respostas da pergunta 1
tem como eu delimitar isso na criteria??
marcelo.bellissimo
Kleber-rr:
marcelo.bellissimo:
Supondo que sua classe Resposta tenha uma referência para a Pergunta, assim:
Pergunta pergunta = new Pergunta();
pergunta.setId(id);// seta o id da pergunta aqui, e depois passa ela pro Criteria:
List<Respostas> results = c.add(Restrictions.eq("pergunta", pergunta)).list();
Pois é man, mas tipo assim: eu tenho cadastradas, por exemplo, as perguntas 1 e 2
eu quero que me apareçam somente as respostas da pergunta 1
tem como eu delimitar isso na criteria??
Então, é justamente isso que tá fazendo essa criteria… você está buscando uma lista de objetos Resposta, onde a Pergunte tem o id=? …
Kleber-rr
marcelo.bellissimo:
Kleber-rr:
marcelo.bellissimo:
Supondo que sua classe Resposta tenha uma referência para a Pergunta, assim:
Pergunta pergunta = new Pergunta();
pergunta.setId(id);// seta o id da pergunta aqui, e depois passa ela pro Criteria:
List<Respostas> results = c.add(Restrictions.eq("pergunta", pergunta)).list();
Pois é man, mas tipo assim: eu tenho cadastradas, por exemplo, as perguntas 1 e 2
eu quero que me apareçam somente as respostas da pergunta 1
tem como eu delimitar isso na criteria??
Então, é justamente isso que tá fazendo essa criteria… você está buscando uma lista de objetos Resposta, onde a Pergunte tem o id=? …
Mano, vou testar e te falo. Valeu.
marcelo.bellissimo
Quando for assim, faz o teste, e vê qual o SQL que ele gera… e se tiver errado do jeito que eu fiz, mal ai, é que hoje é segunda-feira, sabe como é… :hunf:
Kleber-rr
Se sei man, valeu!!!
Kleber-rr
Amigão, ficaria mais ou menos assim??
@SuppressWarnings("unchecked")
public List<Respostas> getRespostasByPergunta1(Long id) {
Criteria c = session.createCriteria(Respostas.class);
Perguntas pergunta = new Perguntas();
pergunta.setCod_perguntas(id); //aqui vc pediu para setar o id da pergunta: por exemplo a pergunta de id 1, como ficaria??
List<Respostas> results = c.add(Restrictions.eq("pergunta", pergunta))
.list();
return results;
}
Desculpa o aluguel
valeu.
Kleber-rr
E o método no Bean, ficaria assim??
public List<Respostas> getRespostasPergunta1() {
Session session = HibernateUtil.currentSession();
QuestionarioDao dao = new QuestionarioDao(session, Questionario.class);
List<Respostas> lista = dao.getRespostasByPergunta1(this.questionario
.getResposta().getPergunta().getCod_perguntas());
return lista;
}
Agradeço a ajuda.
marcelo.bellissimo
Então, do jeito que tá ai, tá certo:
Quando você chamar esse método, tá passando o id da pergunta, creio eu, pelo método this.questionario.getResposta().getPergunta().getCod_perguntas(), e o criteria vai adicionar o id (se é que ele existe) na criteria… no problems…
Kleber-rr
marcelo.bellissimo:
Então, do jeito que tá ai, tá certo:
Quando você chamar esse método, tá passando o id da pergunta, creio eu, pelo método this.questionario.getResposta().getPergunta().getCod_perguntas(), e o criteria vai adicionar o id (se é que ele existe) na criteria… no problems…
Marcelo, não funcionou…
eu tenho q passar esse valor para a critéria ou para o método (acho q para o método), pois ele me retorna uma lista vazia…
a agora??
Kleber-rr
Minha tabela no postgresql está assim:
CREATE TABLE resposta
(
cod_respostas bigint NOT NULL,
descricao character varying(255),
marcar boolean,
resposta_complemento character varying(255),
perguntas_cod_perguntas bigint,
CONSTRAINT resposta_pkey PRIMARY KEY (cod_respostas),
CONSTRAINT fkebb72721ba848fcf FOREIGN KEY (perguntas_cod_perguntas)
REFERENCES pergunta (cod_perguntas) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);
ALTER TABLE resposta OWNER TO postgres;
A tabela está devidamente alimentada, o que eu quero é fazer uma consulta apenas dos itens com valor 1 do campo perguntas_cod_perguntas.
Alguem pode ajudar?
Valeu!!
marcelo.bellissimo
Então… esse método aqui tá retornando algum valor?
Kleber-rr
marcelo.bellissimo:
Então... esse método aqui tá retornando algum valor?
Lembre-se que a restrição atua sobre a propriedade e não sobre o atributo da classe. Ou seja, um getXXX será chamado.
marcelo.bellissimo
Foi justamente o que eu falei pra ele… agora, o problema é que ele não está conseguindo pegar o código da pergunta… ai já é outro problema, nada de errado com a Criteria em sí…
Kleber, é simples… não sei como está o seu código mas é só dar um jeito de pegar o código da Pergunta e passar para aquele método que fizemos acima… simples…
Kleber-rr
sergiotaborda:
Kleber-rr:
Olá pessoal, td bem??
É o seguinte: quero montar uma criteria mais ou menos assim:
@SuppressWarnings("unchecked")
public List<Respostas> getRespostasByPergunta(Long id) {
Criteria c = session.createCriteria(Respostas.class);
List<Respostas> results = c.createCriteria("pergunta").add(
Restrictions.eq("cod_pergunta", id)).list();
return results;
}
Vc tem um método na classe da pergunta chamado getCod_pergunta()?
Não use _ nos nomes. use a convenção de javabeans. o metodo deve ser getCodigoPergunta e o criteria deve ser
Veja bem, ele é do tipo Perguntas… então faça isso na criteria:
Criteria criteria = session.createCriteria(Resposta.class);
Perguntas pergunta = new Perguntas();
pergunta.setId(new Long(1));//aqui estou supondo q exista esse metodo setId, substitua pelo real que existe ai
criteria.add(Restricions.eq("pergunta", pergunta) );
List results = criteria.list();
Entendeu o porque? O Hibernate trabalha com os objetos mapeados, então se voce mapeou um atributo do tipo Perguntas, ele vai querer um objeto Perguntas na Criteria… relaxa, no começo é assim mesmo… é só saber interpretar o erro que ele te mostra, e prestar atenção nos detalhes …
Veja bem, ele é do tipo Perguntas... então faça isso na criteria:
Criteria criteria = session.createCriteria(Resposta.class);
Perguntas pergunta = new Perguntas();
pergunta.setId(new Long(1));//aqui estou supondo q exista esse metodo setId, substitua pelo real que existe ai
criteria.add(Restricions.eq("pergunta", pergunta) );
List results = criteria.list();
Entendeu o porque? O Hibernate trabalha com os objetos mapeados, então se voce mapeou um atributo do tipo Perguntas, ele vai querer um objeto Perguntas na Criteria... relaxa, no começo é assim mesmo... é só saber interpretar o erro que ele te mostra, e prestar atenção nos detalhes ...
publicList<Respostas> getRespostasByPergunta1() { // tire o parametro, pois vc nao precisa deleCriteriacriteria=session.createCriteria(Respostas.class); Perguntaspergunta=newPerguntas(); pergunta.setCodPerguntas(newLong(1)); criteria.add(Restrictions.eq("pergunta",pergunta)); Listresults=criteria.list(); returnresults; }
e no bean:
publicList<SelectItem>getRespostasPergunta1(){Sessionsession=HibernateUtil.currentSession();RespostasDaodao=newRespostasDao(session,Respostas.class);List<Respostas>respostas=dao.getRespostasByPergunta1();// remova o parametro tbmList<SelectItem>items=newArrayList<SelectItem>(respostas.size());for(Respostasr:respostas){items.add(newSelectItem(r.getCodRespostas(),r.getDescricao()));}returnitems;}
Bem, acho que é só... :roll:
Kleber-rr
Blz pessoal. resolvido.
Valeu marcelo. Abs.
marcelo.bellissimo
Bem, problema resolvido, agora sim é hora de “dar pitaco”… odeio fazer isso antes de resolver o problema… seguinte, no seu DAO, o mais aconselhável seria deixar assim (supondo que você terá várias perguntas):
public List<Respostas> getRespostasByPergunta(Perguntas pergunta) {
Criteria criteria = session.createCriteria(Respostas.class);
criteria.add(Restrictions.eq("pergunta", pergunta));
List results = criteria.list();
return results;
}
// se quiser crie mais métodos que recebam parametros de tipos diferentes:
public List<Respostas> getRespostasByPergunta(Long idPergunta) {
Perguntas pergunta = new Perguntas();
pergunta.setCodPerguntas(idPergunta);
return getRespostasByPergunta(pergunta);
}
Sacou o que eu fiz aqui? Deixei o método mais “genérico”, ele pode receber um objeto Perguntas que você mesmo cria ou recupera do banco e tem um id qualquer, ou pode criar métodos que recebam diretamente o id da pergunta que você quer, e esse método irá criar o objeto Perguntas e chamar o método certo… sei lá, não sei qual a sua idéia, mas eu faria assim…
Kleber-rr
marcelo.bellissimo:
Bem, problema resolvido, agora sim é hora de “dar pitaco”… odeio fazer isso antes de resolver o problema… seguinte, no seu DAO, o mais aconselhável seria deixar assim (supondo que você terá várias perguntas):
public List<Respostas> getRespostasByPergunta(Perguntas pergunta) {
Criteria criteria = session.createCriteria(Respostas.class);
criteria.add(Restrictions.eq("pergunta", pergunta));
List results = criteria.list();
return results;
}
// se quiser crie mais métodos que recebam parametros de tipos diferentes:
public List<Respostas> getRespostasByPergunta(Long idPergunta) {
Perguntas pergunta = new Perguntas();
pergunta.setCodPerguntas(idPergunta);
return getRespostasByPergunta(pergunta);
}
Sacou o que eu fiz aqui? Deixei o método mais “genérico”, ele pode receber um objeto Perguntas que você mesmo cria ou recupera do banco e tem um id qualquer, ou pode criar métodos que recebam diretamente o id da pergunta que você quer, e esse método irá criar o objeto Perguntas e chamar o método certo… sei lá, não sei qual a sua idéia, mas eu faria assim…
Marcelão, eu faço assim, generico mesmo, mas nesse caso, específico, eu estava precisando setar o valor do objeto diretamente no dao…
A única idéia que me apareceu para bolar um questionario de perguntas e respostas foi essa.
Claro que, com o tempo, a gente vai aperfeiçoando.
Agradeço a paciência!!
Abs.
marcelo.bellissimo
sergiotaborda:
Não use _ nos nomes. use a convenção de javabeans. o metodo deve ser getCodigoPergunta e o criteria deve ser