【发布时间】:2010-03-30 20:56:46
【问题描述】:
我正在使用 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
【问题讨论】:
-
您的标准还有更多吗?从那个错误看来,您正在返回一个 Long 值而不是映射实体。你的投影是什么?看起来你只是有一个小组。您似乎没有与您的 group by 聚合。
-
我把标准放在上面。它有更多的行,但它们在这里无关紧要,它们只是另一个限制。我不知道它是否有更好的方法来使用休眠条件对数据进行分组。
-
好的,很抱歉,但您介意将 SQL 用于您要执行的操作吗?从您的标准示例中我不明白。您是否在 .forClass 中为您的实体类参数放入 Class.class?好吧,对于预测,您通常有一些要投影的东西(select 语句部分),而您只有一个没有聚合函数的 group by(通常伴随一个 group by)。
-
我将 SQL 用于我正在尝试做的事情。我把“Class.class”作为一个例子。 :)
标签: hibernate jsf richfaces detachedcriteria