Определение страницы, содержащей заданную запись, с помощью JPA (Hibernate)

Как я могу узнать позицию записи в запросе JPA?

У меня есть служба, которая возвращает выгружаемые результаты, реализуя более или менее метод с этой сигнатурой.:

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всегда установлен и может быть более чем одним полем.

Решение до сих пор

До сих пор у меня есть несколько решений, которые:

  1. Не очень хороши, но решают проблему:

Используя предоставленный запрос, я выбираю только идентификатор без подкачки и выполняю просто indexOf], чтобы найти его позицию, и на основе позиции я могу узнать страницу, на которой находится запись, а затем выполнить обычный процесс, используя уже реализованный getRecordsPage(long page, int pageSize).

  1. Не так хорошо, потому что он тесно связан с базой данных:

Поскольку я использую 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).

Хорошее решение

Требования:

  1. должны поддерживать порядок по нескольким полям;
  2. при наличии запроса возвращает позицию записи или смещение страницы, содержащей запись;

Хорошим решением будет:

  1. чисто JPA;
  2. будет Хорошо если один дополнительный запрос выполняется в базе данных только для того, чтобы узнать позицию записи;
  3. будет Ok , если спящий режим используется в какой-то момент (, поскольку в этом случае спящий режим находится за JPA ).
8
задан Francisco Spaeth 22 July 2012 в 11:09
поделиться