J'utilise Richfaces + HibernateQuery pour créer une liste de données. J'essaye d'employer des projections d'Hibernate pour grouper mon résultat de recherche. Voici le code:Problème lors de l'utilisation des projections Hibernate
final DetachedCriteria criteria = DetachedCriteria
.forClass(Class.class, "c")
.setProjection(Projections.projectionList()
.add(Projections.groupProperty("c.id")));
...
dans le fichier xhtml j'ai le code suivant:
<rich:dataTable width="100%" id="dataTable" value="#{myBean.dataModel}" var="row">
<f:facet name="header">
<rich:columnGroup>
......
</rich:columnGroup>
</f:facet>
<h:column>
<h:outputText value="#{row.id}"/>
</h:column>
<h:column>
<h:outputText value="#{row.name}"/>
</h:column>
Mais quand je lance la page, il me donne l'erreur suivante:
Error: value="#{row.id}": The class 'java.lang.Long' does not have the property 'id'.
Si je supprime la projection du code, cela fonctionne correctement, mais le résultat n'est pas groupé. Alors, quelle erreur pourrait se produire ici?
EDIT: Voici tous les critères:
final DetachedCriteria criteria = DetachedCriteria.forClass(Event.class, "e");
...
joins....
...
criteria.setProjection(Projections.distinct(Projections.projectionList()
.add(Projections.groupProperty("e.id").as("e.id"))));
getDao().findByCriteria(criteria);
si je prends la ligne "setProjection" il fonctionne très bien. Je ne comprends pas pourquoi il donne cette erreur en mettant cette ligne.
Voici la requête que je suis en train de faire:
select e.event_id from event e
inner join event_product_group epg
on e.event_id = epg.event_id
inner join product_group pg
on pg.product_group_id = epg.product_group_id
where pg.description like '%TEXT%'
group by e.event_id
Y a-t-il plus à vos critères? De cette erreur, il semble que vous récupériez une valeur longue et non une entité mappée. Quelles sont vos projections? On dirait que vous avez juste un groupe par. Vous ne semblez pas avoir d'agrégat avec votre groupe. –
J'ai mis les critères ci-dessus. Il a plus de lignes mais ils n'ont pas d'importance ici, ils sont juste une autre restriction. Je ne sais pas si elle a un meilleur moyen de regrouper les données en utilisant les critères d'hibernation. – Lucas
ok, désolé, mais cela vous dérange de mettre le SQL pour ce que vous essayez de faire? Je ne comprends pas de votre exemple de critère. Mettez-vous Class.class pour votre paramètre de classe d'entité dans .forClass? Eh bien avec les projections, vous avez habituellement quelque chose que vous projetez (la partie de l'instruction select) et vous n'avez qu'un groupe par sans fonction d'agrégat (qui accompagne généralement un groupe par). –