Pessoal,
Estou com uma dúvida que está me matando. Como muitos aqui, não consigo fazer outra coisa até descobrir a solução. Procurei no GUJ e não achei nada parecido.
Tenho uma entidade Noticia.java que faz o seguinte relacionamento:
//outros atributos
@OneToMany(mappedBy="usuario", fetch= FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private Collection<Voto> voto;
//gets and sets
Nisso minha outra entidade Voto.java tem:
[code]// outros atributos
private int voto;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name=“id_noticia”)
@Fetch(FetchMode.JOIN)
private Noticia noticia;
//gets and sets
[/code]
No DAO eu fiz o seguinte:
public List<Noticia> listar() {
Criteria criteria = this.session.createCriteria(Noticia.class);
criteria.addOrder(Order.desc("data_cadastro"));
return criteria.list();
}
Na minha DataTable as notícias são listadas perfeitamente, mas gostaria de colocar na mesma DataTable a média das notas recebidas.
Tentei fazer o seguinte:
[code]public List listar() {
ProjectionList projList = Projections.projectionList();
projList.add(Projections.avg(“voto”).as(“VotoNoticia.avgVoto”));
projList.add(Projections.groupProperty(“tb.voto”));
DetachedCriteria dcrit = DetachedCriteria.forClass(Voto.class,"tb")
.setProjection(projList);
Criteria criteria = this.session.createCriteria(Noticia.class);
criteria.createCriteria("voto", "tb").add(Subqueries.exists(dcrit));
criteria.addOrder(Order.desc("dataCadastro"));
return criteria.list();
}
[/code]
Só que tem um problema. Está listando só as notícias que já tem voto e se tiver mais de um voto está listando várias vezes a mesma notícia.
Alguém já usou o AVG que poderia ajudar?
Grato.