Cómo hacer un paginado QueryDSL consulta con Spring JPA?
-
12-12-2019 - |
Pregunta
QueryDSL define un OrderSpecifier
interfaz y un ejemplo de que se puede obtener fácilmente por cualquier campo llamando asc()
o desc()
.El QueryDslPredicateExecutor
interfaz de Spring Data JPA tiene incluso un findAll()
el método que se lleva a OrderSpecifier
s como parámetros.
org.springframework.data.domain.PageRequest
sin embargo no sabe nada acerca de QueryDSL y tiene su propio camino para la definición de la consulta en orden, es decir, org.springframework.data.domain.Sort
.Puede contener un número de org.springframework.data.domain.Sort.Order
s que se parece mucho a la de OrderSpecifier
s, excepto que ellos no son el tipo de seguridad.
Así que, si quiero hacer paginado de consulta que utiliza la clasificación, hay realmente ninguna manera de utilizar QueryDSL para definir eso?
Solución
Se debe trabajar como esto si usted no puede encontrar otra manera
private Sort sortBy(Path<?> path) {
return new Sort(Sort.Direction.ASC, path.getMetadata().getExpression().toString());
}
Otros consejos
Sé que ha pasado un tiempo y no estoy seguro de que esto estaba disponible en el momento de la OP, pero ahora hay una QPageRequest objeto introducido, que permite ordenar a través de QueryDSL para ser añadido a la primavera de datos jpa Consulta DSL...
Aquí está una manera mucho más sencilla de construir un Sort
objeto utilizando QueryDSL:
new QSort(user.manager.firstname.asc())
A continuación, se puede utilizar en un PageRequest
así:
new PageRequest(0, 10, new QSort(user.manager.firstname.asc()))
El getExpression()
el método ha sido eliminado, y tuve expresiones similar a QPost.post.period.periCode
que necesitaba un recorrido, y sin el nombre completo de la expresión no podía hacer nada al respecto, así que ahora me he hecho un método que reúne period.periCode
y funciona a la perfección en 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);