Olá pessoal do GUJ, estou com uma dúvida de como projetar na consulta do Hibernate a quantidades de ‘filhos’ de uma relação 1:N. Vamos as classes:
[code]public class Grupo{
private String nome;
@Transient
private int tamanhoListaSubgrupos, tamanhoListaItens;
@OneToMany(mappedBy = “grupo”, fetch = FetchType.LAZY)
private List subgrupos;
@OneToMany(mappedBy = “grupo”, fetch = FetchType.LAZY)
private List itens;
// get e set …
}
public class Item{
private String nome;
@ManyToOne @JoinColumn(name = “fk_grupo”)
private Grupo grupo;
//get, set e outros atributos
}
public class Subgrupo{
private String nome;
@ManyToOne @JoinColumn(name = “fk_grupo”)
private Grupo grupo;
//get, set e outros atributos
}[/code]
O problema começa quando eu tenho que listar os grupos, porque na view além de ser exibida as informações do Grupo, eu também tenho que exibir a quantidade de itens e subgruupos associados a ele. O select para isso é esse:
select g.id as id_grupo, g.nome as nome_grupo,
(select count(*) from subgrupos s where g.id = s.fk_grupo) as total_subgrupos,
(select count(*) from itens i where g.id = i.fk_grupo) as total_itens
from grupos g
Como estou usando o hibernate eu fiz desse jeito:
[code]public List all() throws Exception {
Criteria c = session.createCriteria(Grupo.class,"g")
.setProjection(Projections.projectionList()
.add(Projections.property("g.id").as("id") )
.add(Projections.property("g.nome").as("nome") ) )
.setResultTransformer(new AliasToBeanResultTransformer(Grupo.class) );
List<Grupo> lista = c.list();
for(Grupo g : lista){
g.setTamanhoListaItens(getTotalItensGrupo(g.getId()));
g.setTamanhoListaSubgrupos(getTotalSubgrupoGrupo(g.getId()));
}
return lista;
}[/code]
Reparem que na primeira parte do método eu projeto os campos do Grupo, depois da lista gerada, eu a percorro e chamo os métodos getTotalItensGrupo(long id)
e getTotalSubgrupoGrupo(long id)
que retornam a quantidade de itens e subgrupos respectivamente associados ao Grupo. Tá funcionando perfeitamente, mas fica parecendo um POG . Minha pergunta é essa: como projetar diretamente com o Criteria o count(*) da relação @OneToMany?
Abraço a todos.
Jonh Paulo