powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate criteria сортировка и выборка записей.
5 сообщений из 5, страница 1 из 1
Hibernate criteria сортировка и выборка записей.
    #38857283
Андрей170
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Использую в проекте hibernate для получения данных из таблиц. Имеются таблицы объемом по 1-100 млн записей.
Задача следующая: получить данные из таблицы предварительно отсортированные по одному из поле (скажем по ID) и получить скажем записи с 21 по 40.
Использую следующий код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
public static List<?> findAllEssenceByTableCode(String code, // сущность hibernate
                                                    Integer startFrom, // начиная с какой записи вернуть результат
                                                    Integer limitTo, // сколько вернуть записей
                                                    String sortData, // условия сортировки
                                                    List<Parameter> parameters // дополнительные параметры фильтрации данных
    ) {

        SessionFactory sessionFactory = SessionFactoryManager.getSessionFactory();
        Session currentSession = null;
        int i = 0;
        try {
            if (sessionFactory != null) {
                // получение сессии
                currentSession = sessionFactory.openSession();
                Criteria criteria = currentSession.createCriteria(code);
                criteria.add(Restrictions.isNull("dateD"));
                if (WebUtils.isNotNull(sortData)) {
                   //следующие 2 строки кода добавляют сортировку 
                    MySort sort = parse(sortData);
                    criteria.addOrder(DataBaseUtils.createOrder(sort));
                }
                // различных условий фильтрации из списка параметров
                // код add.criteria запускается в цикле
                DataBaseUtils.createConditions(criteria, parameters);

                //ограничения по количеству объектов
                criteria.setFirstResult(startFrom);
                criteria.setMaxResults(limitTo);


                
                // получение данных
                List<?> essence = criteria.list();

                return essence;

            }

        } catch (Exception er) {

           logger.debug()

        } 
        finally {
            if (currentSession != null) {
                currentSession.close();
            }
        }
        return null;
    }



Собственно данный код отрабатывает не правильно: при выполнении сперва включаются все фильтры данных, включая с какой строки и количество строк, а лишь затем по данному срезу в 20 строк проводит сортировку. Как перестроить данный метод чтобы сперва проходил запрос с основными фильтрами, следом делал сортировку всего массива данных (скажем если не было основных фильтров то это вся таблица), а лишь за тем накладывал ограничение по количеству возвращаемых строк данных.

Данный под генерит sql на пример такой (точные запрос от hibernate я опускаю, но смысл тот же)
Код: sql
1.
2.
3.
4.
select t.* from 
(select r.*, rownum as rnum from cats r where date_delete is not null) t
where t.rnum >= 21 and t.rnum<(21+20)
          order by t.id desc



мне необходимо, чтобы сгенрированный запрос был типа
Код: sql
1.
2.
3.
4.
select t.* from 
(select r.*, rownum as rnum from cats r where date_delete is not null
           order by r.id desc) t
where t.rnum >= 21 and t.rnum<(21+20)
...
Рейтинг: 0 / 0
Hibernate criteria сортировка и выборка записей.
    #38857374
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня с похожими вводными, хибер(3.6.0) генерит вот такое
Код: sql
1.
Hibernate: select * from ( select row_.*, rownum rownum_ from ( select this_.ID as ID28_3_, bla-bla ) row_ where rownum <= ?) where rownum_ > ?


попробуйте для теста упростить запрос, выкиньте всё лишнее, и посмотрите что конкретно сгенерил хибер. По логике, ограничение выдачи должно делаться после основных условия запроса, а не наоборот.
Если на простом запросе он будет правильно формировать запрос, начинайте добавлять условия и прочее, возможно сможете найти причину такого поведения.
...
Рейтинг: 0 / 0
Hibernate criteria сортировка и выборка записей.
    #38857465
Андрей170
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DDiver,

Спасибо Вам, в написанном Вами все верно, только в данном примере нет сортировки... именно что если добавить сортировку то он добавит ее в конец, а не в условие во внутрь. Беда начинается как только работать приходится с сортировкой.
...
Рейтинг: 0 / 0
Hibernate criteria сортировка и выборка записей.
    #38857503
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей170DDiver,
Беда начинается как только работать приходится с сортировкой.
Код: java
1.
2.
crit.addOrder(Order.desc("createDate"));
crit.addOrder(Order.desc("id"));


Код: sql
1.
Hibernate: select * from ( select this_.ID as ID28_3_, this_.CREATEDATE as CREATEDATE28_3_, … order by this_.CREATEDATE desc, this_.ID desc ) where rownum <= ?


Всё-таки попробуйте на простом запросе, у меня всё работает и с сортировками и с джоинами и т.д.
...
Рейтинг: 0 / 0
Hibernate criteria сортировка и выборка записей.
    #38857506
Андрей170
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо всем кто читал или старался помочь...
Я разобрался, работает hibernate правильно. Проблема была на стороне EXT JS. А не в написанном для rest api.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate criteria сортировка и выборка записей.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]