HQL - идентификатор строки для разбивки на страницы - PullRequest
8 голосов
/ 29 января 2009

Кто-нибудь знает, есть ли в HQL ключевое слово для определения таких строк, как ROWID или ROWNUM?

Я хотел бы реализовать разбиение на страницы с HQL, но я не могу использовать .setMaxResult () или .setFirstResult (), потому что я не работаю с объектом сеанса напрямую и поэтому не использую объект Query, а просто создаю мой запрос в виде строки и использовать метод .find ().

Я пытался использовать LIMIT и OFFSET в своем запросе, но HQL, похоже, игнорирует эти ключевые слова и возвращает мне весь результат, несмотря ни на что.

Я также не могу использовать критерии Hibernate, потому что он не поддерживает предложение "HAVING", которое появляется в моем запросе.

Мое последнее средство - ограничить набор результатов с помощью ключевого слова ROWNUM / ROWID. У кого-нибудь еще есть другие предложения?

Ответы [ 3 ]

18 голосов
/ 08 мая 2009

это одна из ситуаций, когда светит спящий режим:

типичное решение с hql-запросом.

int elementsPerBlock = 10;
int page = 2;

return  getSession().createQuery("from SomeItems order by id asc")
            .setFirstResult(elementsPerBlock * (page-1) + 1 )
            .setMaxResults(elementsPerBlock)
            .list();

hibernate переведет это в шаблон, который понимается базой данных в соответствии с ее SQL-диалектом. на оракуле он создаст подвыбор с ROWNUM

Насколько мне известно, это невозможно сделать с помощью "чистого" hql.

2 голосов
/ 16 мая 2014

Разбивка на страницы с использованием интерфейса запросов:

Существует два метода интерфейса Query для разбивки на страницы.

1. Запрос setFirstResult (int startPosition): Этот метод принимает целое число, представляющее первую строку в вашем наборе результатов, начиная со строки 0.

2. Запрос setMaxResults (int maxResult): Этот метод сообщает Hibernate о получении фиксированного числа maxResults объектов. Используя два вышеуказанных метода вместе, мы можем создать компонент подкачки в нашем веб-приложении или приложении Swing.

Пример:

Query query = session.createQuery("FROM Employee");
query.setFirstResult(5);
query.setMaxResults(10);
List<Employee> list = query.list();
for(Employee emp: list) {            
   System.out.println(emp);
}

Пагинация с использованием интерфейса Criteria: Существует два метода интерфейса Criteria для разбивки на страницы.

1. Критерии setFirstResult (int firstResult):

Установить первый результат для извлечения.

2. Элемент списка Критерии setMaxResults (int maxResults):

Установить ограничение на количество извлекаемых объектов.

Пример:

Criteria criteria = session.createCriteria(Employee.class);
criteria.setFirstResult(5);
criteria.setMaxResults(10);            
List<Employee> list = criteria.list();
for(Employee emp: list) {            
    System.out.println(emp);
}
1 голос
/ 29 января 2009

Ну, в принципе, вы можете получить доступ к ROWNUM / ROWID из HSQL (хотя я никогда не использовал его). Смотрите, например Блог Рона . Это должно сработать.

Но я хотел бы отметить, что вы действительно работаете против Hibernate и HSQL, если вы делаете это таким образом. Правильным способом является использование setMaxResult () и друзей. Если вы не можете сделать это из-за своей архитектуры, я бы хотя бы пересмотрел свои архитектурные решения. Я знаю, что это всегда трудные изменения, но, возможно, оно того стоит.

...