LINUX.ORG.RU

[java][hibernate] добавить ещё одно поле в SELECT


0

1

Доброго времени суток.
На проекте используем технологии из сабжа + postgres, в контроллере истории понадобилось возвращать не только сами данные из таблицы истории, но и кол-во этих данных в одном запросе, для правильного разбиения вывода на страницы.
В идеальном случае, я бы написал просто select h.*, count(1) over() from history h where ...
но запросы составляем через заполнение Criteria.
В доках пишут нечто вроде

Criteria c = hibernateSession.createCriteria(History.class);
ProjectionList proList = Projections.projectionList();
proList.add(Projections.sqlProjection("count(1) over() as count", new String[] { "count" },new org.hibernate.type.Type[] {StandardBasicTypes.LONG }));
c.setProjection(proList);
но в этом случае я не получаю все полей вообще, далее пишут, что следует забивать все поля в прожекшн в таком виде :
proList.add(Projections.groupProperty("id"),"id");
но это ещё хуже - на каждый чих при изменении класса History придётся менять загрузку - а это instant fail
как это можно победить?
сейчас сделал так, как написано выше, ещё вариант сделать через динамическое добавление полей рефлекшном, но это тоже не очень хорошо.

★★★★

а почему нельзя сначала спросить количество записей, потому уже делать limit и offer

почему нельзя описать ему объект сразу с полем count?

на каждый чих при изменении класса History придётся менять загрузку

так может не надо менять класс history? есть и фиг с ним.

Rastafarra ★★★ ()
Ответ на: комментарий от Rastafarra

а почему нельзя сначала спросить количество записей, потому уже делать limit и offer

таки задача и стоит сделать вместо двух запросов один, постгрес, кстати, с помощью оконной функции over() может выдавать реальное количество записей по запросу, до применения лимитов

почему нельзя описать ему объект сразу с полем count?

можно, а толку? как-то же туда нужно положить данные

так может не надо менять класс history? есть и фиг с ним.

это сейчас он нравится таким как есть, а завтра, может быть, туда потребуется добавить шахматы и курсисток

TERRANZ ★★★★ ()

Переходите на OpenJPA и их FetchPlan, приятно удивитесь

jreznot ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.