2010-03-30 3 views
0

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 
+1

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. –

+0

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

+0

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). –

Répondre

1

ok si vous êtes désireux de projeter l'identifiant unique d'un événement, vous n'avez pas besoin du groupe par. Utilisez simplement Projections.id(). Regroupement par un identifiant unique va juste vous donner cette liste d'identifiants de toute façon.

Si vous avez des identifiants uniques 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 et que vous avez une requête qui renvoie 1, 2, 3, 4 et lui indique de grouper par l'ID alors il va faire 4 'groupes' puisque ce sont des id uniques :)

éditer: bien la liste des projets et une collection d'objets de projection afin que vous puissiez ajouter autant d'objets de projection que vous le souhaitez. Continuez simplement à les ajouter. Je crois que vous utilisez Projections.property ("property_name").

edit2: aussi ce que vous faites n'a pas vraiment besoin de critères. vous pouvez utiliser HQL.