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

Использую в проекте 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
19.01.2015, 11:47
    #38857374
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate criteria сортировка и выборка записей.
у меня с похожими вводными, хибер(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
19.01.2015, 13:17
    #38857465
Андрей170
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate criteria сортировка и выборка записей.
DDiver,

Спасибо Вам, в написанном Вами все верно, только в данном примере нет сортировки... именно что если добавить сортировку то он добавит ее в конец, а не в условие во внутрь. Беда начинается как только работать приходится с сортировкой.
...
Рейтинг: 0 / 0
19.01.2015, 13:48
    #38857503
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate criteria сортировка и выборка записей.
Андрей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
19.01.2015, 13:49
    #38857506
Андрей170
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hibernate criteria сортировка и выборка записей.
Всем спасибо всем кто читал или старался помочь...
Я разобрался, работает hibernate правильно. Проблема была на стороне EXT JS. А не в написанном для rest api.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate criteria сортировка и выборка записей. / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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