Как запросить данные через Spring data JPA с пользовательским смещением и ограничением (диапазон)

можно ли получить данные в определенных пользователем диапазонах [int starting record-int last record]?

в моем случае пользователь будет определять в строке запроса, в котором ряд он хочет получить данные. Я пробовал что-то вроде этого

Pageable pageable = new PageRequest(0, 10);
    Page<Project> list = projectRepository.findAll(spec, pageable);

где spec-моя определенная спецификация, но, к сожалению, это не помогает. Может быть, я делаю что-то не так.

Я видел другие весенние СПД методов, но не очень помощь.

пользователь может ввести что-то вроде этого localhost:8080/Section/employee? диапазон {"columnName": name,"from": 6,"to": 20}

таким образом, это говорит, чтобы получить данные сотрудника, и он получит первые 15 записей (отсортированных по columnName ) не имеет значения на данный момент.

Если вы можете предложить мне что-то лучше, что было бы здорово.если вы думаете, что я не предоставил достаточно информации, пожалуйста, дайте мне знать, я предоставлю необходимые информация.

обновление: Я не хочу использовать native или создавать операторы запроса (пока у меня нет другой опции). Может быть что-то вроде этого:

Pageable pageable = new PageRequest(0, 10);
        Page<Project> list = projectRepository.findAll(spec, new pageable(int startIndex,int endIndex){
// here my logic.

});

Если у вас есть лучшие варианты, вы можете предложить мне это.

спасибо.

4 ответов


ваш подход не работает, потому что new PageRequest(0, 10); doens не делать то, что вы думаете. Как указано в docs, входные аргументы page и size, не предел и смещение.

насколько я знаю (и кто-то поправит меня, если я ошибаюсь), нет поддержки "из коробки" для того, что вам нужно в репозиториях SrpingData по умолчанию. Но вы можете создать пользовательскую реализацию Pagable, что примут лимит/смещение параметров. Вот основной пример - данные по весны Pageable и ограничение / смещение


мы можем сделать это с помощью разбиения на страницы и установки имени столбца таблицы базы данных, значения и строки, как показано ниже:

 @Transactional(readOnly=true)
 public List<String> queryEmployeeDetails(String columnName,String columnData, int startRecord, int endRecord) {
    Query query =  sessionFactory.getCurrentSession().createQuery(" from Employee emp where emp.col= :"+columnName);
    query.setParameter(columnName, columnData);
    query.setFirstResult(startRecord);
    query.setMaxResults(endRecord);
    List<String> list = (List<String>)query.list();
    return list;
}

если я правильно понимаю вашу проблему, вы хотите, чтобы ваш репозиторий, чтобы позволить пользователю

  1. укажите критерии для запроса (через Specification)
  2. предоставить столбец для сортировки
  3. укажите диапазон результата для извлечения.

если мое понимание правильно, то:

для достижения 1. вы можете использовать JpaSpecificationExecutor из Spring Data JPA, которые позволяют вам пройти в Specificiation для запрос.

и 2 и 3 достижимы в JpaSpecificationExecutor при использовании Pagable. Pageable позволяет указать начальный индекс, количество записей и столбцы сортировки для запроса. Вам нужно будет реализовать свой диапазон на основе Pageable. PageRequest является хорошей ссылкой на то, что вы можете реализовать (или вы можете расширить его, я считаю).


поэтому я получил эту работу, как один из предложенных ответов, я реализовал свой собственный Pageable и переопределил getPagesize(),getOffset(),getSort() вот и все.(В моем случае мне больше не нужно)

public Range(int startIndex, int endIndex, String sortBy) {
        this.startIndex = startIndex;
        this.endIndex = endIndex;
        this.sortBy = sortBy;
    }

    @Override
    public int getPageSize() {
        if (endIndex == 0)
            return 0;
        return endIndex - startIndex;
    }

    @Override
    public int getOffset() {
        // TODO Auto-generated method stub
        return startIndex;
    }

    @Override
    public Sort getSort() {
        // TODO Auto-generated method stub
        if (sortBy != null && !sortBy.equalsIgnoreCase(""))
            return new Sort(Direction.ASC, sortBy);
        else
            return new Sort(Direction.ASC, "id");
    }

здесь параметр startindex ,endindex включительно начальный и последний индекс записи.

для доступа к нему :

repository.findAll(spec,new Range(0,20,"id");