Как запросить данные через 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;
}
если я правильно понимаю вашу проблему, вы хотите, чтобы ваш репозиторий, чтобы позволить пользователю
- укажите критерии для запроса (через
Specification
) - предоставить столбец для сортировки
- укажите диапазон результата для извлечения.
если мое понимание правильно, то:
для достижения 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");