Olá pessoal,
Estou desde ontem pesquisando sobre como resolver meu problema, mas infelizmente não consegui, acredito que cheguei perto, mas sempre por um detalhe ou outro não funciona como o esperado.
Bom, para iniciar a Query que preciso fazer é a seguinte:
SELECT mn.*, count(m.id) as filhos
FROM menu mn
LEFT JOIN menu m
ON mn.menu_id = m.id
GROUP BY mn.id
ORDER BY mn.ordem
Com ela pretendo retornar todos os registros da tabela menu, junto com a quantidade de registros que referencia cada um, pelo seu campo menu_id. Como segue a estrutura de meu Model:
public class Menu {
@Id
@GeneratedValue
public Long id;
public String descricao;
public String link;
public String titulo;
public String ordem;
@ManyToOne
public Menu menu;
public int nivel;
@Transient
public int filhos;
}
Não sei se fiz certo, mas criei um campo com annotation @Transient para que receba este valor no resultado da Query. Notem, que tenho um relacionamento para a mesma tabela (Menu) com annotation @ManyToOne. Fiz isto para que um registro possa conter um relacionamento de qual seria seu registro pai.
Com esta estrutura acima, eu estou tentando montar meu result, com o código:
Criteria c = session.createCriteria(Menu.class, "mn");
c.setProjection(Projections.projectionList()
.add(Projections.groupProperty("mn.id"), "id")
.add(Projections.property("mn.descricao"), "descricao")
.add(Projections.property("mn.link"), "link")
.add(Projections.property("mn.ordem"), "ordem")
.add(Projections.property("mn.menu"), "menu")
.add(Projections.property("mn.nivel"), "nivel")
.add(Projections.count("m.id"), "filhos"));
c.createAlias("menu", "m", Criteria.LEFT_JOIN, Restrictions.eqProperty("m.menu.id", "mn.id"));
c.setResultTransformer(new AliasToBeanResultTransformer(Menu.class));
c.addOrder(Order.asc("ordem"));
return c.list();
O problema agora é que ao criar esta associação, por padrão o Hibernate está inserindo uma Restrição que no meu caso não pode ter, observe a query gerada:
select
this_.id as y0_,
this_.descricao as y1_,
this_.link as y2_,
this_.ordem as y3_,
this_.menu_id as y4_,
this_.nivel as y5_,
count(m1_.id) as y6_
from
menu this_
left outer join
menu m1_
on this_.menu_id=m1_.id
and (
m1_.menu_id=this_.id
)
group by
this_.id
order by
y3_ asc
Sendo que a restrição padrão trata-se da linha:
Já procurei de várias maneiras para resolver o problema, mas não consigo, alguém pode me ajudar?
Se faltou alguma informação, por favor me falem que adiciono aqui.
Obrigado desde já…