Выберите "все столбцы" с "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.