wake-up-neo.net

Spring Data Rest - Nach mehreren Eigenschaften sortieren

Ich habe eine Entität wie unten

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

Mit Spring Data Rest (Gosling Release Train) kann ich angeben

localhost/Person?sort=name,asc

um den Namen aufsteigend zu sortieren. Nun, in einem Fall, in dem ich nach numberOfHands absteigend und name aufsteigend sortieren muss. Ich kann angeben

localhost/Person?sort=numberOfHands,name,asc

Aber ich kann es nicht spezifizieren

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

Gibt es eine Möglichkeit, mehrere Sortierreihenfolgen anzugeben?

Vielen Dank!

48
rakpan

Lösung (tl; dr)

Wenn Sie nach mehreren Feldern sortieren möchten, geben Sie den Parameter sort einfach mehrmals in die URI ein. Zum Beispiel your/uri?sort=name,asc&sort=numberOfHands,desc. Spring Data kann dann ein Pageable -Objekt mit mehreren Sortierungen erstellen.

Erläuterung

Es gibt keinen definierten Standard für die Übermittlung mehrerer Werte für einen Parameter in einem URI. Siehe Richtige Methode zum Übergeben mehrerer Werte für denselben Parameternamen in der GET-Anforderung .

Es gibt jedoch einige Informationen in der Java Servlet Spec , die darauf hinweisen, wie Java Servlet-Container Anforderungsparameter analysieren.

Die Methode getParameterValues gibt ein Array von String Objekten zurück, die alle Parameterwerte enthalten, die einem Parameternamen zugeordnet sind. ... - Java Servlet Spec, Abschnitt 3.1

Das Beispiel in diesem Abschnitt gibt an (obwohl es Anforderungs- und Textdaten mischt)

Wenn beispielsweise eine Anfrage mit einer Abfragezeichenfolge von a=hello Und einem Post-Body von a=goodbye&a=world Gestellt wird, wird der resultierende Parametersatz nach a=hello, goodbye, world Sortiert.

Dieses Beispiel zeigt, dass bei mehrfacher Darstellung eines Parameters (a im Beispiel) die Ergebnisse zu einem String[] Aggregiert werden.

76
M. Deinum

Hier erfahren Sie, wie Sie das Multi-Sort-Objekt manuell/programmatisch erstellen.

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

Hinweis: Diese Lösung löst nicht direkt die ursprüngliche Frage, kann jedoch Besuchern helfen, die auf diese Frage gestoßen sind, während sie nach einer Lösung suchen, wie mehrere Eigenschaften aus einer Back-End-Perspektive/auf eine etwas "hardcodierte" Weise sortiert werden können. (Für diese Lösung sind keine URI-Parameter erforderlich/erforderlich)

12
Pim Hazebroek