2016-10-04 4 views
0

Я пытаюсь запустить Hibernate запрос, который возвращает все строки, за исключением последних 5 пять строк, так что мой SQL запрос следующим образом:Hibernate: как выбрать все строки, кроме последних N строк?

session.createQuery("FROM Book 
WHERE id NOT IN(SELECT id FROM Book ORDER BY ID DESC LIMIT 5) 
ORDER BY title"); 

К сожалению, LIMIT не допускается в Hibernate, так что я получил ошибка говоря:

HTTP Status 500 - org.hibernate.hql.internal.ast.QuerySyntaxException: неожиданный маркер: LIMIT около линии 1, столбец 78 [FROM models.Book WHERE идентификатор NOT IN (SELECT ID FROM models.Book ORDER BY ID DESC LIMIT 5) ЗАКАЗ BY title]

Как я могу это исправить?

ответ

2

Существует ответ здесь

How do you do a limit query in HQL?

Предел никогда не поддерживается положение в HQL. Вы должны использовать setMaxResults().

+0

Я знаю это, но я не могу использовать этот метод в моем случае, только если я зациклил результаты «LIMITED», а затем сделаю выбор. Мне нужно что-то работать лучше :) – Mohammad

1

Похоже, вы спрашиваете hibernate pagination

сначала получить подсчитывать:

String countQ = "Select count (f.id) from Foo f"; 
Query countQuery = session.createQuery(countQ); 
Long countResults = (Long) countQuery.uniqueResult(); 

Затем рассчитать предельные начальные и конечные точки:

Long start = countResult - limit; 

Затем с помощью постраничной будущее:

Session session = sessionFactory.openSession(); 
Query query = sess.createQuery("From Foo"); 
query.setFirstResult(start); 
query.setMaxResults(limit); 
List<Foo> fooList = fooList = query.list(); 

Вы, возможно, придется обновить запросы, но я полагаю, вы получите идею

0

Я также просил подобного рода вопросы, связанные с ограничением «LIMIT» ключевого слова в спящий режим.

Hibernate: how to select last N rows in ascending order of id? (in single query)

Я думаю, что есть только два пути осталось, хотя это не лучшее исполнение.

  1. Два запросов (получить список идентификаторов, то запрос с NOT IN список идентификаторов)
  2. один запрос с дальнейшей обработкой данных (например, нарежьте из последних 5 данных из списка результата)

надеюсь, что это поможет

Смежные вопросы