Выберите "все столбцы" с "group by" в запросах на спящий режим

Я хочу написать запрос критериев, используя "group by" и хочу вернуть все столбцы.

Plane sql выглядит следующим образом:

select * from Tab group by client_name order by creation_time;

Я понимаю, что у него будет count(distinct client_name) количество строк.

Мой текущий запрос, который, похоже, не дает правильного результата, выглядит следующим образом:

Criteria criteria = getSession(requestType).createCriteria(Tab.class);
        criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("client_name")));
        criteria.addOrder(Order.asc("creationTime"));

Этот запрос возвращает только "client_name". Я не хочу вручную ставить все имена столбцов. Должен быть какой-то способ, что можно сделать?

Ответ 1

Я думаю, вы что-то недопонимаете. Если вы GROUP BY в SQL, то вам нужно группировать все выбранные столбцы. То же самое относится к Hibernate - если вы groupProperty в Projection, вы сообщаете Hibernate, что этот столбец является столбцом группы. Если никакие другие столбцы/поля не указаны, Hibernate предположит, что вы их не хотите, так как они также должны быть сгруппированы.

Чтобы сделать шаг назад: что вы пытаетесь сделать? Если у вас есть дубликаты данных по всем столбцам в таблице, у вас могут быть плохие данные или данные будут сохраняться некорректно. По крайней мере, ваш ключ будет испорчен.

Ответ 2

В спящем режиме для прогнозов все необходимые столбцы необходимо добавить в список прогнозов. Чтобы получить результат в сущности, мы должны использовать setResultTransformer. Проверьте пример ниже, чтобы получить группу в спящем режиме:

 ProjectionList projectionList = Projections.projectionList();
    projectionList.add(Projections.groupProperty("column1"));
    projectionList.add(Projections.property("column2"));
    projectionList.add(Projections.property("column3"));
    criteria.setProjection(projectionList);
    criteria.setResultTransformer(Transformers.aliasToBean(Table.class));

Ответ 3

при использовании прогноза гибернации вы должны добавить все столбцы, которые необходимы в списке прогнозов. вы использовали Projections.projectionList(). add (Projections.groupProperty( "client_name" ))

это. поэтому ясно, что возвращать только client_name.