[Resolvida] Problema em elaborar essa criteria

30 respostas
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; }

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.

30 Respostas

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

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=? … :smiley:

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=? … :smiley:

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

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

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

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?
this.questionario.getResposta().getPergunta().getCod_perguntas()
Ess método dá erro, substitui por esse aqui (que inclusive eu uso em combos alinhados):
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;

	}

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

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

List<Respostas> 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.

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

List<Respostas> 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.

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

sergiotaborda

Kleber-rr:

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

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

Kleber-rr

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

Valeu!!

marcelo.bellissimo

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

Valeu!!

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

Kleber-rr
marcelo.bellissimo:
Kleber-rr:
Pessoal, como ficaria essa query em criteria??
SELECT * FROM resposta WHERE perguntas_cod_perguntas = 1

Valeu!!

Criteria criteria = session.createCriteria(Resposta.class);
criteria.add(Restricions.eq("perguntas_cod_perguntas", new Long(1) ));
List results = criteria.list();
Marcelao, testei e deu essa exception:
Caused by: org.hibernate.QueryException: could not resolve property: perguntasCodPerguntas of: br.gov.rr.setrabes.estrutura.Respostas
E ela está na minha classe e na minha tabela:
@Entity
@Table(name = "resposta")
public class Respostas {

	@Id
	@GeneratedValue
	@Column(name = "codRespostas")
	private Long codRespostas;
	private String descricao;
	private String resposta_complemento;
	private Boolean marcar;

	@ManyToOne
	@JoinColumn(name = "perguntasCodPerguntas")
	private Perguntas pergunta;
CREATE TABLE resposta
(
  "codRespostas" bigint NOT NULL,
  descricao character varying(255),
  marcar boolean,
  respostacomplemento character varying(255),
  "perguntasCodPerguntas" bigint,
  CONSTRAINT resposta_pkey PRIMARY KEY ("codRespostas"),
  CONSTRAINT fkebb72721ba848fcf FOREIGN KEY ("perguntasCodPerguntas")
      REFERENCES pergunta (codperguntas) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);
ALTER TABLE resposta OWNER TO postgres;

O q pode ser isso??

Kleber-rr

eae pessoal?

Kleber-rr
Fiz algumas tentativas aqui até q enfim... o erro mudou!!! agora é outro:D
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field br.gov.rr.setrabes.estrutura.Perguntas.codPerguntas to java.lang.Long
Mo método no Dao:
@SuppressWarnings("unchecked")
	public List<Respostas> getRespostasByPergunta2(Long id) {
		Criteria c = session.createCriteria(Respostas.class);
		c.add(Restrictions.eq("pergunta", new Long(1)));
		List results = c.list();
		return results;
	}
O método no bean:
public List<SelectItem> getRespostasPergunta1() {
		Session session = HibernateUtil.currentSession();
		RespostasDao dao = new RespostasDao(session, Respostas.class);
		List<Respostas> respostas = dao.getRespostasByPergunta2(new Long(1));

		List<SelectItem> items = new ArrayList<SelectItem>(respostas.size());

		for (Respostas r : respostas) {
			items.add(new SelectItem(r.getCodRespostas(), r.getDescricao()));
		}

		return items;

	}

Pessoal, desculpa a amolação, eu sei q está perto de resolver... agradeço a compreensão de todos!

marcelo.bellissimo

Nesse caso você tem:

@ManyToOne @JoinColumn(name = "perguntasCodPerguntas") private Perguntas pergunta;

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 …

Kleber-rr
marcelo.bellissimo:
Nesse caso você tem:
@ManyToOne  
     @JoinColumn(name = "perguntasCodPerguntas")  
     private Perguntas pergunta;
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 ...

Blz, to entendendo... hehehe :D

Ficaria desse geito??
@SuppressWarnings("unchecked")
	public List<Respostas> getRespostasByPergunta1(Long id) {
		Criteria criteria = session.createCriteria(Respostas.class);
		Perguntas pergunta = new Perguntas();
		pergunta.setCodPerguntas(new Long(1));
		criteria.add(Restrictions.eq("pergunta", pergunta));
		List results = criteria.list();
		return results;
	}
e no Bean?? ficaria assim?
public List<SelectItem> getRespostasPergunta1() {
		Session session = HibernateUtil.currentSession();
		RespostasDao dao = new RespostasDao(session, Respostas.class);
		List<Respostas> respostas = dao.getRespostasByPergunta1(new Long(1));
		List<SelectItem> items = new ArrayList<SelectItem>(respostas.size());

		for (Respostas r : respostas) {
			items.add(new SelectItem(r.getCodRespostas(), r.getDescricao()));
		}

		return items;

	}
marcelo.bellissimo
Tá certo, só alguns toques, aqui no seu DAO:
public List<Respostas> getRespostasByPergunta1() {  // tire o parametro, pois vc nao precisa dele
         Criteria criteria = session.createCriteria(Respostas.class);  
         Perguntas pergunta = new Perguntas();  
         pergunta.setCodPerguntas(new Long(1));  
         criteria.add(Restrictions.eq("pergunta", pergunta));  
         List results = criteria.list();  
         return results;  
     }
e no bean:
public List<SelectItem> getRespostasPergunta1() {  
         Session session = HibernateUtil.currentSession();  
         RespostasDao dao = new RespostasDao(session, Respostas.class);  
         List<Respostas> respostas = dao.getRespostasByPergunta1(); // remova o parametro tbm
         List<SelectItem> items = new ArrayList<SelectItem>(respostas.size());  
   
         for (Respostas r : respostas) {  
             items.add(new SelectItem(r.getCodRespostas(), r.getDescricao()));  
         }  
   
         return items;  
   
     }

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… :frowning:
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

List<Respostas> 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.

Exato… Taborda, sabe quantas vezes eu peguei projetos que seguiam os padrões? Me recuso á responder… tanto que eu nem reclamo mais… :roll:

Kleber-rr

marcelo.bellissimo:
sergiotaborda:
Não use _ nos nomes. use a convenção de javabeans. o metodo deve ser getCodigoPergunta e o criteria deve ser

List<Respostas> 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.

Exato… Taborda, sabe quantas vezes eu peguei projetos que seguiam os padrões? Me recuso á responder… tanto que eu nem reclamo mais… :roll:

Realmente, é complicado… eu mesmo naum tinha conhecimento sobre essas convenções, mas vou passar a estuda-las.
Agradeço muito pela dica.

Criado 1 de fevereiro de 2010
Ultima resposta 2 de fev. de 2010
Respostas 30
Participantes 3