Проблема с использованием проекций Hibernate - PullRequest
0 голосов
/ 31 марта 2010

Я использую Richfaces + HibernateQuery для создания списка данных. Я пытаюсь использовать проекции Hibernate для группировки результатов запроса. Вот код:

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 Ответ

1 голос
/ 31 марта 2010

хорошо, если вы просто хотите спроецировать уникальный идентификатор события, вам не нужна группировка по. Просто используйте Projection.id (). Группировка по уникальному идентификатору все равно даст вам этот список идентификаторов.

Если у вас есть уникальные идентификаторы 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, и у вас есть запрос, который возвращает 1, 2, 3, 4 и говорит ему сгруппировать по идентификатору, то он собирается создать 4 «группы», так как это уникальные идентификаторы:)

edit: хорошо составьте список проектов и коллекцию проекционных объектов, чтобы вы могли добавлять туда столько элементов проекции, сколько захотите. Просто продолжайте добавлять их. Я полагаю, что вы используете Projection.property ("имя_свойства").

edit2: а также то, что вы делаете, вам не нужны критерии. Вы могли бы использовать HQL.

...