[Resolvida] Problema em elaborar essa criteria

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

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:

[code]@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;[/code]

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

eae pessoal?

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:

[code] public List<SelectItem> getRespostasPergunta1() {
Session session = HibernateUtil.currentSession();
RespostasDao dao = new RespostasDao(session, Respostas.class);
List<Respostas> respostas = dao.getRespostasByPergunta2(new Long(1));

	List&lt;SelectItem&gt; items = new ArrayList&lt;SelectItem&gt;(respostas.size());

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

	return items;

}[/code]

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

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 …

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

Blz, to entendendo… hehehe :smiley:

Ficaria desse geito??

@SuppressWarnings("unchecked") public List&lt;Respostas&gt; 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?

[code]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;

}[/code]

Tá certo, só alguns toques, aqui no seu DAO:

public List&lt;Respostas&gt; 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:

[code] 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;  

 } [/code]

Bem, acho que é só… :roll:

Blz pessoal. resolvido.

Valeu marcelo. Abs.

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&lt;Respostas&gt; 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&lt;Respostas&gt; 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…

[quote=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&lt;Respostas&gt; 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&lt;Respostas&gt; 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…[/quote]

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.

[quote=sergiotaborda]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]

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

[quote=marcelo.bellissimo][quote=sergiotaborda]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]

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

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