Como fazer uma paginada QueryDSL consulta com o Spring JPA?
-
12-12-2019 - |
Pergunta
QueryDSL define um OrderSpecifier
interface e um exemplo para o que pode ser facilmente obtido para qualquer terreno por telefone asc()
ou desc()
.O QueryDslPredicateExecutor
interface do Spring Data JPA tem até um findAll()
método que leva OrderSpecifier
s como parâmetros.
org.springframework.data.domain.PageRequest
no entanto, não sabe nada sobre QueryDSL e ele tem o seu próprio caminho para a definição de consulta ordem de classificação, a saber, org.springframework.data.domain.Sort
.Ele pode conter um número de org.springframework.data.domain.Sort.Order
s que são muito parecidos com os OrderSpecifier
s, exceto que eles não são o tipo de seguro etc.
Então, se eu quiser fazer consulta paginada, que utiliza a classificação, há realmente nenhuma maneira de usar QueryDSL para a definição do que?
Solução
Ele deve funcionar como isso se você não pode encontrar outra forma de
private Sort sortBy(Path<?> path) {
return new Sort(Sort.Direction.ASC, path.getMetadata().getExpression().toString());
}
Outras dicas
Eu sei que já faz um tempo e eu não estou certo de que isso era disponível na época do OP, mas agora há um QPageRequest objeto introduzidas, o que permite a classificação através de QueryDSL para ser adicionado ao spring data jpa Consulta DSL...
Aqui está uma maneira muito mais simples para a construção de uma Sort
objeto usando QueryDSL:
new QSort(user.manager.firstname.asc())
Em seguida, você pode usá-lo em um PageRequest
assim:
new PageRequest(0, 10, new QSort(user.manager.firstname.asc()))
O getExpression()
método foi removido, e eu tinha expressões parecidas QPost.post.period.periCode
que necessário uma transversal, e sem o nome completo de expressão eu não podia fazer nada sobre isso, então agora eu fiz um método que reúne period.periCode
e funciona perfeitamente no 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);