Я использую метод PagingAndSortingRepository и findAll (pageable pageable) для подкачки моих данных. Я думаю, что нет никакого способа обеспечить какое-либо условие. Например, когда-нибудь я хочу выбирать и подкачки адреса, где city = NY. Есть ли способ обеспечить условие и пейджинг одновременно?
Как совместить разбивку на страницы с запросом критериев в Spring Data JPA?
Ответ 1
PagingAndSortingRepository
просто добавляет самые базовые методы CRUD в режиме разбивки на страницы. Как описывает справочная документация , вы можете просто добавить параметр Pageable
к любому методу запроса, который вы определяете для достижения разбивки на страницы этого запроса.
interface CustomerRepository implements Repository<Customer, Long> {
Page<Customer> findByLastname(String lastname, Pageable pageable);
List<Customer> findByFirstname(String firstname, Pageable pageable);
}
Первый метод вернет Page
, содержащий метаданные страницы, такие как доступные доступные элементы. Чтобы вычислить эти данные, он вызовет дополнительный запрос подсчета для полученного запроса. Второй метод запроса возвращает простой результирующий набор без запроса счетчика.
Ответ 2
Для разбивки на страницы вам нужны 2 метода, такие как getCount (страница, доступная на странице) и findAll (доступная страница)
Использование этой функции в Hibernate, однако, тривиально. Если у вас есть любой запрос HQL, вы можете просто сделать это:
public Long getCount(Pageable pageable) {
Query q = session.createQuery("Select count(t) From TableClass t where t.city = 'NY'");
Long cnt = (Long) q.uniqueResult();
return cnt;
}
public List<TableClass> findAll(Pageable pageable) {
Query q = session.createQuery("From TableClass t where t.city = 'NY'");
q.setFirstResult(start);
q.setMaxResults(length);
List<TableClass> tableClasslist = q.list();
return tableClasslist;
}
Аналогично, если у вас есть запрос Criteria, это фактически то же самое:
public Long getCount(Pageable pageable) {
Criteria c = session.createCriteria(TableClass.class);
c.setProjection(Projections.rowCount());
Long cnt = (Long) c.uniqueResult();
return cnt;
}
public List<TableClass> findAll(Pageable pageable) {
Criteria c = session.createCriteria(TableClass.class);
c.setParameter("city","NY");
c.setFirstResult(start);
c.setMaxResults(length);
List<TableClass> tableClasslist = c.list();
return tableClasslist ;
}