У меня есть служба, которая возвращает выгружаемые результаты, реализуя более или менее метод с этой сигнатурой.:
List<Record> getRecordsPage(long page, int pageSize);
Когда это вызывается, я просто создаю запрос и настраиваю его следующим образом.:
TypedQuery<Record> query = entityManager.createQuery(criteriaQuery);
query.setFirstResult(page * pageSize);
query.setMaxResults(pageSize);
Это выводит результат на страницу. И это работает, как и ожидалось, и довольно просто.
Еще одно требование, которое у меня есть, заключается в реализации метода, который извлекает страницу, содержащую определенную запись. Реализация метода со следующей сигнатурой:
List<Record> getRecordsPage(Record record, int pageSize);
Этот метод должен привести к правильной странице, на которой находится запись. Например, для вызова getRecordsPage(RECORD4, 2)
с учетом состояния базы данных:
1. RECORD1
2. RECORD2
3. RECORD3
4. RECORD4
5. RECORD5
возвращаемая страница должна быть 2, содержащей [RECORD3, RECORD4]
.
Параметр ORDER BY
всегда установлен и может быть более чем одним полем.
До сих пор у меня есть несколько решений, которые:
Используя предоставленный запрос, я выбираю только идентификатор без подкачки и выполняю просто indexOf
], чтобы найти его позицию, и на основе позиции я могу узнать страницу, на которой находится запись, а затем выполнить обычный процесс, используя уже реализованный getRecordsPage(long page, int pageSize)
.
Поскольку я использую mySQL, я мог бы выполнить sql, например:select r from (select rownum r, id from t order by x,y) z where z.id = :id
, который вернул бы позицию записи, и я мог бы использовать его для вызова getRecordsPage(long page, int pageSize)
.
Требования:
Хорошим решением будет: