Question

QueryDSL définit un OrderSpecifier interface et une instance pour cela peut être facilement obtenue pour n'importe quel champ en appelant asc() ou desc().Le QueryDslPredicateExecutor l'interface de Spring Data JPA a même un findAll() méthode qui prend OrderSpecifiers comme paramètres.

org.springframework.data.domain.PageRequest cependant, il ne connaît rien à QueryDSL et possède sa propre méthode pour définir l'ordre de tri des requêtes, à savoir org.springframework.data.domain.Sort.Il peut contenir un certain nombre de org.springframework.data.domain.Sort.Orders qui ressemblent beaucoup OrderSpecifiers, sauf qu'ils ne sont pas de type sécurisé, etc.

Donc, si je veux créer une requête paginée qui utilise le tri, n'y a-t-il vraiment aucun moyen d'utiliser QueryDSL pour définir cela ?

Était-ce utile?

La solution

Cela devrait fonctionner comme ça si vous ne trouvez pas d'autre moyen

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

Autres conseils

Je sais que cela fait un moment et je ne suis pas sûr que cela soit disponible au moment du PO, mais il existe maintenant un QPageRequest objet introduit qui permet d'ajouter le tri via QueryDSL aux données Spring jpa Query DSL...

Voici une façon beaucoup plus simple de construire un Sort objet utilisant QueryDSL :

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

Ensuite, vous pouvez l'utiliser dans un PageRequest ainsi:

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

Le getExpression() La méthode a été supprimée et j'avais des expressions similaires à QPost.post.period.periCode lequel nécessaire un parcours, et sans le nom complet de l'expression, je ne pouvais rien y faire, alors maintenant j'ai créé une méthode qui rassemble period.periCode et fonctionne parfaitement sur 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top