2010-03-30 73 views
0

我正在使用Richfaces + HibernateQuery來創建數據列表。我正在嘗試使用Hibernate Projections對我的查詢結果進行分組。下面是代碼:使用休眠投影的問題

final DetachedCriteria criteria = DetachedCriteria 
    .forClass(Class.class, "c") 
    .setProjection(Projections.projectionList() 
    .add(Projections.groupProperty("c.id"))); 
    ... 

在.xhtml文件我有以下代碼:

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

但是當我運行的網頁它給了我下面的錯誤:

Error: value="#{row.id}": The class 'java.lang.Long' does not have the property 'id'. 

如果我從代碼中取出投影,它可以正常工作,但它不會對結果進行分組。那麼,這裏可能會發生哪些錯誤?

編輯:以下是完整的標準:

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); 

,如果我把它工作正常的 「setProjection」 行。我不明白爲什麼會出現這樣的錯誤。

這裏是我想要做的查詢:

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

是否有更符合你的標準?從這個錯誤看來,你正在取回一個Long值而不是一個映射實體。你在預測什麼?看起來你只有一羣人。你似乎沒有與你的羣組彙總。 – 2010-03-30 21:07:57

+0

我把上面的標準。它有更多的線條,但它們在這裏並不重要,它們只是另一個限制。我不知道是否有更好的方法來使用hibernate標準對數據進行分組。 – Lucas 2010-03-30 21:22:26

+0

好吧,對不起,但是你介意把SQL用於你想要做的事情嗎?我不明白你的標準例子。您是否在.forClass中爲您的實體類參數放入Class.class?與預測一樣,你通常會預測一些東西(選擇語句部分),並且你只有一個沒有聚合函數的小組(通常伴隨着一個小組)。 – 2010-03-30 21:28:49

回答

1

OK,如果你只是想投射事件的唯一ID,那麼你不要被需要的組。只需使用Projections.id()。無論如何,通過一個唯一的ID分組就會給你這個ID列表。

如果您有唯一的標識1,2,3,4,5,6,7,8,9,10,並且您有一個查詢返回1,2,3,4,並通過id將其分組那麼它將製作4個'組',因爲它們是唯一的ID :)

編輯:好項目列表和投影對象的集合,以便您可以在那裏添加儘可能多的投影項目。只是不斷添加它們。我相信你使用Projections.property(「property_name」)。

edit2:你也在做什麼你並不需要標準。你可以使用HQL。