【问题标题】:Problem using Hibernate Projections使用休眠投影的问题
【发布时间】: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


【解决方案1】:

好的,如果您只是想投射事件的唯一 ID,那么您不需要 group by。只需使用 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。

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 2011-04-11
    • 1970-01-01
    • 2015-07-17
    • 2019-02-08
    • 1970-01-01
    • 2020-09-05
    • 2013-05-31
    • 2012-11-26
    相关资源
    最近更新 更多