web-dev-qa-db-fra.com

Spring Data Rest - Tri par plusieurs propriétés

J'ai une entité comme ci-dessous

Class Person{
String id;
String name;
String numberOfHands;
}

Avec Spring Data Rest (Gosling Release Train), je peux spécifier

localhost/Person?sort=name,asc

pour trier nom nom croissant. Maintenant, dans un cas où je dois trier par nombreDeMoins décroissant et par nom croissant. Je suis capable de préciser

localhost/Person?sort=numberOfHands,name,asc

Mais je ne suis pas capable de spécifier

localhost/Person?sort=numberOfHands,desc,name,asc

Existe-t-il un moyen de spécifier plusieurs ordres de tri?

Merci!

48
rakpan

Solution (tl; dr)

Lorsque vous souhaitez trier plusieurs champs, il vous suffit de saisir plusieurs fois le paramètre sort dans l'URI. Par exemple your/uri?sort=name,asc&sort=numberOfHands,desc. Spring Data est alors capable de construire un objet Pageable avec plusieurs tris.

Explication

Il n'y a pas vraiment de norme définie sur la manière de soumettre plusieurs valeurs pour un paramètre dans un URI. Voir Manière correcte de transmettre plusieurs valeurs pour le même nom de paramètre dans la requête GET .

Cependant, Java Servlet Spec contient des informations indiquant comment Java les conteneurs de servlets analysent les paramètres de requête.

La méthode getParameterValues renvoie un tableau d'objets String contenant toutes les valeurs de paramètre associées à un nom de paramètre. ... - Spécification Java Servlet, section 3.1

L’échantillon plus loin dans cette section indique (bien qu’il mélange les données de requête et de corps)

Par exemple, si une requête est faite avec une chaîne de requête de a=hello et un corps de message de a=goodbye&a=world, le jeu de paramètres résultant serait ordonné a=hello, goodbye, world.

Cet exemple montre que lorsqu'un paramètre (a dans l'exemple) est présenté plusieurs fois, les résultats sont agrégés dans un String[].

76
M. Deinum

Voici comment construire l'objet multi-tri manuellement/par programme.

Sort sort = Sort.by(
    Sort.Order.asc("name"),
    Sort.Order.desc("numberOfHands"));
return personRepository.findAll(sort);

Remarque: cette solution ne résout pas directement la question initiale posée, mais peut aider les visiteurs qui ont atterri sur cette question tout en cherchant une solution, comment trier sur plusieurs propriétés à partir d'une perspective dorsale/de manière quelque peu "codée en dur". (cette solution ne nécessite/prend aucun paramètre d'URI)

12
Pim Hazebroek