Consulta com Hibernate + calcular média

3 respostas
Dapcapix

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:

// outros atributos

private int voto;
	
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name="id_noticia") 
@Fetch(FetchMode.JOIN) 
private Noticia noticia;

//gets and sets
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:

public List<Noticia> 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();
}

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.

3 Respostas

dreampeppers99

@OneToMany(mappedBy="usuario", fetch= FetchType.LAZY) @Cascade(org.hibernate.annotations.CascadeType.ALL) private Collection<Voto> voto;
Não seria algo assim.

@OneToMany(mappedBy="noticia", fetch= FetchType.LAZY) @Cascade(org.hibernate.annotations.CascadeType.ALL) private Collection<Voto> voto;
Digo pela bidirecionalidade?!

Hebert_Coelho

dreampeppers99:
@OneToMany(mappedBy="usuario", fetch= FetchType.LAZY) @Cascade(org.hibernate.annotations.CascadeType.ALL) private Collection<Voto> voto;
Não seria algo assim.

@OneToMany(mappedBy="noticia", fetch= FetchType.LAZY) @Cascade(org.hibernate.annotations.CascadeType.ALL) private Collection<Voto> voto;
Digo pela bidirecionalidade?!


Isso ta me cheirando copiar colar… :lol:

Dapcapix

uhahuahuahuahuahuahuahuahuahuahua…

Foi sim, mas funciona :stuck_out_tongue: . Troquei aqui e da no mesmo.

Sabem como pegar a informação de média pelo criteria?

Criado 12 de dezembro de 2011
Ultima resposta 12 de dez. de 2011
Respostas 3
Participantes 3