0

Richfaces+HibernateQueryを使用してデータリストを作成しています。HibernateProjectionsを使用してクエリ結果をグループ化しようとしています。コードは次のとおりです。

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
4

1 に答える 1

1

イベントの一意のIDを投影したいだけの場合は、groupbyは必要ありません。Projections.id()を使用するだけです。一意のIDでグループ化すると、とにかくこのIDのリストが表示されます。

一意のID1、2、3、4、5、6、7、8、9、10があり、1、2、3、4を返し、IDでグループ化するように指示するクエリがある場合は、次のようになります。それらは一意のIDであるため、4つの「グループ」を作成します:)

編集:プロジェクトリストとプロジェクションオブジェクトのコレクションを使用して、そこに必要な数のプロジェクションアイテムを追加できます。それらを追加し続けてください。Projections.property( "property_name")を使用していると思います。

edit2:また、あなたがしていることは本当に基準を必要としません。HQLを使用できます。

于 2010-03-30T21:45:43.977 に答える