Я хочу, чтобы пользователь мог указать ограничение (размер возвращаемой суммы) и смещение (первая возвращенная запись/индекс) в моем методе запроса.
Вот мои классы без возможностей пейджинга. Моя сущность:
@Entity
public Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Column(name="NAME")
private String name;
//getters and setters
}
Мой репозиторий:
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
@Query("SELECT e FROM Employee e WHERE e.name LIKE :name ORDER BY e.id")
public List<Employee> findByName(@Param("name") String name);
}
Мой сервисный интерфейс:
public interface EmployeeService {
public List<Employee> findByName(String name);
}
Моя реализация сервиса:
public class EmployeeServiceImpl {
@Resource
EmployeeRepository repository;
@Override
public List<Employee> findByName(String name) {
return repository.findByName(name);
}
}
Теперь я попытаюсь предоставить возможности пейджинга, поддерживающие смещение и ограничение. Мой класс сущностей остается тем же.
Мой "новый" репозиторий принимает параметр страницы:
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
@Query("SELECT e FROM Employee e WHERE e.name LIKE :name ORDER BY e.id")
public List<Employee> findByName(@Param("name") String name, Pageable pageable);
}
Мой "новый" служебный интерфейс имеет два дополнительных параметра:
public interface EmployeeService {
public List<Employee> findByName(String name, int offset, int limit);
}
Моя "новая" реализация службы:
public class EmployeeServiceImpl {
@Resource
EmployeeRepository repository;
@Override
public List<Employee> findByName(String name, int offset, int limit) {
return repository.findByName(name, new PageRequest(offset, limit);
}
}
Это, однако, не то, что я хочу. PageRequest указывает страницу и размер (страница # и размер страницы). Теперь указание размера - именно то, что я хочу, однако я не хочу указывать начальную страницу #, я хочу, чтобы пользователь мог указать начальную запись/индекс. Мне нужно что-то похожее на
public List<Employee> findByName(String name, int offset, int limit) {
TypedQuery<Employee> query = entityManager.createQuery("SELECT e FROM Employee e WHERE e.name LIKE :name ORDER BY e.id", Employee.class);
query.setFirstResult(offset);
query.setMaxResults(limit);
return query.getResultList();
}
В частности, методы setFirstResult() и setMaxResult(). Но я не могу использовать этот метод, потому что я хочу использовать интерфейс репозитория Employee. (Или на самом деле лучше определить запросы через entityManager?) В любом случае, есть ли способ указать смещение без использования entityManager? Заранее спасибо!