docs - Spring Data Rest-Ordenar por mĂșltiples propiedades
form:form spring (2)
Solución (tl; dr)
Cuando desee clasificar en varios campos, simplemente coloque el parámetro de sort
varias veces en el URI. Por ejemplo, your/uri?sort=name,asc&sort=numberOfHands,desc
. Spring Data es capaz de construir un objeto Pageable
con múltiples clasificaciones.
Explicación
Realmente no existe un estándar definido sobre cómo enviar múltiples valores para un parámetro en un URI. Consulte la forma correcta de pasar varios valores para el mismo nombre de parámetro en la solicitud GET .
Sin embargo, hay algo de información en la especificación de servlet de Java que sugiere cómo los contenedores de servlet de Java analizan los parámetros de solicitud.
El método
getParameterValues
devuelve una matriz de objetosString
que contienen todos los valores de parámetros asociados con un nombre de parámetro. ... - Java Servlet Spec, sección 3.1
El ejemplo más adelante en esa sección indica (aunque combina datos de solicitud y cuerpo)
Por ejemplo, si se realiza una solicitud con una cadena de consulta de
a=hello
y un cuerpo de publicación dea=goodbye&a=world
, el conjunto de parámetros resultante se ordenaríaa=hello, goodbye, world
.
Este ejemplo muestra que cuando se presenta un parámetro ( a
en el ejemplo) varias veces, los resultados se agregarán a una String[]
.
Tengo una entidad como abajo
Class Person{
String id;
String name;
String numberOfHands;
}
Con Spring Data Rest (Gosling Release Train), puedo especificar
localhost/Person?sort=name,asc
para ordenar nombre nombre ascendente. Ahora, en un caso en el que necesito ordenar por número, descendiendo y nombrando ascendente. Soy capaz de especificar
localhost/Person?sort=numberOfHands,name,asc
Pero, no puedo especificar
localhost/Person?sort=numberOfHands,desc,name,asc
¿Hay una manera de especificar el orden múltiple?
¡Gracias!
Aquí es cómo construir el objeto de ordenación múltiple manualmente / programáticamente.
Sort sort = Sort.by(
Sort.Order.asc("name"),
Sort.Order.desc("numberOfHands"));
return personRepository.findAll(sort);