Comment faire une requête QueryDSL paginée avec Spring JPA ?
-
12-12-2019 - |
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 OrderSpecifier
s 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.Order
s qui ressemblent beaucoup OrderSpecifier
s, 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 ?
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);