[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??
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<SelectItem> items = new ArrayList<SelectItem>(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 
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?
[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<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:
[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:
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…
[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<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…[/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… 
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<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.[/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<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.[/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.