Как выполнить постраничный запрос QueryDSL с помощью Spring JPA?

StackOverflow https://stackoverflow.com//questions/11673213

Вопрос

QueryDSL определяет OrderSpecifier интерфейс и экземпляр для него можно легко получить для любого поля, вызвав asc() или desc().То QueryDslPredicateExecutor интерфейс Spring Data JPA даже имеет findAll() метод, который принимает OrderSpecifiers в качестве параметров.

org.springframework.data.domain.PageRequest однако ничего не знает о QueryDSL, и у него есть свой собственный способ определения порядка сортировки запросов, а именно org.springframework.data.domain.Sort.Он может содержать несколько org.springframework.data.domain.Sort.Orders, которые очень похожи OrderSpecifiers, за исключением того, что они не являются типобезопасными и т.д.

Итак, если я хочу создать постраничный запрос, который использует сортировку, действительно ли нет способа использовать QueryDSL для определения этого?

Это было полезно?

Решение

Это должно работать так, если вы не можете найти другой способ

private Sort sortBy(Path<?> path) {
    return new Sort(Sort.Direction.ASC, path.getMetadata().getExpression().toString());
}

Другие советы

Я знаю, что прошло много времени, и я не уверен, что это было доступно во время операции, но сейчас есть QPageRequest Запрос QPageRequest введен объект, который позволяет выполнять сортировку с помощью QueryDSL, который будет добавлен в spring data jpa Query DSL...

Вот гораздо более простой способ построить Sort объект, использующий QueryDSL:

new QSort(user.manager.firstname.asc())

Затем вы можете использовать его в PageRequest вот так:

new PageRequest(0, 10, new QSort(user.manager.firstname.asc()))

То getExpression() метод был удален, и у меня были выражения, похожие на QPost.post.period.periCode который необходимый обход, и без полного имени выражения я ничего не мог с этим поделать, поэтому теперь я создал метод, который собирает period.periCode и отлично работает на QPost.post.

private String resolveOrderPath(Path<?> path) {
    StringBuilder stringBuffer = new StringBuilder(path.getMetadata().getName());
    path = path.getMetadata().getParent();
    while(!path.getMetadata().isRoot()) {
        stringBuffer.insert(0, path.getMetadata().getName() + ".");
        path = path.getMetadata().getParent();
    }
    return stringBuffer.toString();
}

Path<?> path = QPost.post.period.periCode;
String propertyPath = resolveOrderPath(path);
Sort sort = new Sort("asc".equals(sSortDir0) ? Sort.Direction.ASC : Sort.Direction.DESC, propertyPath);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top