Есть ли способ прокрутить результаты с JPA / Hibernate? - PullRequest
9 голосов
/ 13 ноября 2010

Я нашел несколько подсказок в Toplink

Query query = em.createQuery("SELECT e FROM Employee e ORDER BY e.lastName ASC, e.firstName ASC");
query.setHint("eclipselink.cursor.scrollable", true);
ScrollableCursor scrollableCursor = (ScrollableCursor)query.getSingleResult();
List<Employee> emps = scrollableCursor.next(10);

Есть ли альтернатива jpa / hibernate?

Ответы [ 5 ]

12 голосов
/ 13 ноября 2010

Насколько мне известно, в JPA для этого нет ничего стандартного.

С Hibernate ближайшая альтернатива, которую я знаю, это API Query / ScrollableResults. Из документации:

10.4.1.6. Прокручиваемая итерация

Если ваш драйвер JDBC поддерживает прокручиваемый ResultSets, запрос Интерфейс может быть использован для получения ScrollableResults объект, который позволяет гибкая навигация по запросу Результаты.

Query q = sess.createQuery("select cat.name, cat from DomesticCat cat " +
                            "order by cat.name");
ScrollableResults cats = q.scroll();
if ( cats.first() ) {

    // find the first name on each page of an alphabetical list of cats by name
    firstNamesOfPages = new ArrayList();
    do {
        String name = cats.getString(0);
        firstNamesOfPages.add(name);
    }
    while ( cats.scroll(PAGE_SIZE) );

    // Now get the first page of cats
    pageOfCats = new ArrayList();    
    cats.beforeFirst();    
    int i=0;    
    while( ( PAGE_SIZE > i++ ) && cats.next() ) pageOfCats.add( cats.get(1) );

}

cats.close()

Обратите внимание, что соединение с открытой базой данных и курсор необходим для этого функциональность. использование setMaxResult() / setFirstResult() если вы нужна автономная функциональность нумерации страниц.

5 голосов
/ 23 февраля 2017

Судя по другим ответам, JPA не поддерживает прокрутку напрямую, но если вы используете Hibernate в качестве реализации JPA, вы можете сделать

javax.persistence.Query query = entityManager.createQuery("select foo from bar");
org.hibernate.Query hquery = query.unwrap(org.hibernate.Query);
ScrollableResults results = hquery.scroll(ScrollMode.FORWARD_ONLY);

, который обращается к базовому API Hibernate для прокрутки, но вы можете использовать всеособенности JPA запросов.(По крайней мере для запросов критериев API JPA имеет некоторые функции, которых нет в старых API Hibernate.)

3 голосов
/ 01 апреля 2014

При обработке большого количества сущностей в большом коде проекта на основе экземпляров List<E> мне приходится писать действительно ограниченную реализацию List с поддержкой только Iterator для просмотра ScrollableResults без рефакторинга всех реализаций служб и прототипов методов.использование List<E>.

Эта реализация доступна в моем IterableListScrollableResults.java Gist

Он также регулярно сбрасывает сущности Hibernate из сеанса.Вот способ его использования, например, при экспорте всех неархивированных объектов из БД в виде текстового файла с циклом for:

Criteria criteria = getCurrentSession().createCriteria(LargeVolumeEntity.class);
criteria.add(Restrictions.eq("archived", Boolean.FALSE));
criteria.setReadOnly(true);
criteria.setCacheable(false);
List<E> result = new IterableListScrollableResults<E>(getCurrentSession(),
        criteria.scroll(ScrollMode.FORWARD_ONLY));
for(E entity : result) {
    dumpEntity(file, entity);
}

В надежде, что это поможет

1 голос
/ 31 октября 2013

Также можно использовать Spring Data.Там вы можете указать запрос и передать в качестве параметра «PageRequest», в котором вы указываете размер страницы и номер страницы:

Page<User> users = repository.findAll(new PageRequest(1, 20));

Для этого вам необходимо расширить PagingAndSortingRepository.

Точно так же, как еще одна альтернатива для просмотра результатов.

Конечно, под ней используется Hibernate, Toplink или любая другая реализация JPA, которую вы настраиваете.

0 голосов
/ 16 ноября 2010

В JPA вы можете использовать query.setFirstResult и query.setMaxResults

...