[Resolvida] Problema em elaborar essa criteria

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.

Valeu pessoal.

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

[quote=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();[/quote]

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??

[quote=Kleber-rr][quote=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();[/quote]

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??[/quote]

Então, é justamente isso que tá fazendo essa criteria… você está buscando uma lista de objetos Resposta, onde a Pergunte tem o id=? … :smiley:

[quote=marcelo.bellissimo][quote=Kleber-rr][quote=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();[/quote]

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??[/quote]

Então, é justamente isso que tá fazendo essa criteria… você está buscando uma lista de objetos Resposta, onde a Pergunte tem o id=? … :smiley: [/quote]

Mano, vou testar e te falo. Valeu.

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:

Se sei man, valeu!!!
:smiley:

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 :smiley:

valeu.

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.

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…

[quote=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…[/quote]
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??
:smiley:

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!!

Então… esse método aqui tá retornando algum valor?

[quote=marcelo.bellissimo]Então… esse método aqui tá retornando algum valor?

Ess método dá erro, substitui por esse aqui (que inclusive eu uso em combos alinhados):

[code] public List<SelectItem> getRespostasPergunta1() {
Session session = HibernateUtil.currentSession();
RespostasDao dao = new RespostasDao(session, Respostas.class);
List<Respostas> respostas = dao.getRespostasByPergunta1(this.pergunta
.getCod_perguntas());
List<SelectItem> items = new ArrayList<SelectItem>(respostas.size());
for (Respostas r : respostas) {
items.add(new SelectItem(r.getCod_respostas(), r.getDescricao()));
}
return items;

}[/code]

O negocio agora é passar o valor para esse método pelo próprio método…

[quote=Kleber-rr]Olá pessoal, td bem??
É o seguinte: quero montar uma criteria mais ou menos assim:

@SuppressWarnings("unchecked") public List&lt;Respostas&gt; getRespostasByPergunta(Long id) { Criteria c = session.createCriteria(Respostas.class); List&lt;Respostas&gt; results = c.createCriteria("pergunta").add( Restrictions.eq("cod_pergunta", id)).list(); return results; }
[/quote]

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

List&lt;Respostas&gt; results = c.createCriteria("pergunta").add(
				Restrictions.eq("codigoPergunta", id)).list();

Lembre-se que a restrição atua sobre a propriedade e não sobre o atributo da classe. Ou seja, um getXXX será chamado.

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…

[quote=sergiotaborda][quote=Kleber-rr]Olá pessoal, td bem??
É o seguinte: quero montar uma criteria mais ou menos assim:

@SuppressWarnings("unchecked") public List&lt;Respostas&gt; getRespostasByPergunta(Long id) { Criteria c = session.createCriteria(Respostas.class); List&lt;Respostas&gt; results = c.createCriteria("pergunta").add( Restrictions.eq("cod_pergunta", id)).list(); return results; }
[/quote]

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

List&lt;Respostas&gt; results = c.createCriteria("pergunta").add(
				Restrictions.eq("codigoPergunta", id)).list();

Lembre-se que a restrição atua sobre a propriedade e não sobre o atributo da classe. Ou seja, um getXXX será chamado.[/quote]

Blz Sergio, valeu pela dica… realmente naum sabia disso… mas e quanto à minha dúvida??

[quote=Kleber-rr]
Blz Sergio, valeu pela dica… realmente naum sabia disso… mas e quanto à minha dúvida??[/quote]

Qual duvida. Altera o codigo como lhe disse que vai funcionar como vc quer.

Pessoal, como ficaria essa query em criteria?? SELECT * FROM resposta WHERE perguntas_cod_perguntas = 1

Valeu!!

[quote=Kleber-rr]Pessoal, como ficaria essa query em criteria?? SELECT * FROM resposta WHERE perguntas_cod_perguntas = 1

Valeu!![/quote]

Criteria criteria = session.createCriteria(Resposta.class); criteria.add(Restricions.eq("perguntas_cod_perguntas", new Long(1) )); List results = criteria.list();