2009-02-06 2 views
9

Я пытаюсь сделать разбиение на страницы с Hibernate использованием setFirstResult() и setMaxResults(), но я не получаю ожидаемые результаты при определении первого результата 0.setFirstResult Hibernate (в) проблема с драйвером JDBC Oracle

При выполнении следующего :

Query query = session.createQuery(queryString); 
query.setFirstResult(0); 
query.setMaxResults(30); 
List list = query.list(); //list.size() returns 10 

, но если я установил первый результат 1 (или что-нибудь другое, чем 0 по этому вопросу):

query.setFirstResult(1); 
query.setMaxResults(30); 
List list = query.list(); //list.size() returns 30 

Я читал, что это известная ошибка в драйвере jdbc, но я искал решение, и я не могу найти его. Кто-нибудь сталкивался с чем-то похожим и нашел для него решение?

ответ

13

Видимо, добавление setFetchSize() делает трюк. Так что-то вроде этого сейчас работает отлично:

query.setFirstResult(0); 
query.setMaxResults(30); 
query.setFetchSize(30); 
List list = query.list(); //list.size() now returns... wait for it... 30 
+3

Вы замечательный человек! У меня просто была эта точная проблема, и 'setFetchSize()' исправил ее немедленно. – Nick

1

Другое решение заключается в реализации вашей собственной Oracle Диалект:

public class Oracle10gDialectLimitBugfix extends Oracle10gDialect { 
    @Override 
    public boolean forceLimitUsage() { 
     return true; 
    } 
} 

См https://forum.hibernate.org/viewtopic.php?p=2379096

UPDATE: Это, кажется, фиксируется в Oracle 11.2.0.1 .0

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