2017-02-16 1 views
6

Ich habe einen Datenbankservice mit Spring Boot 1.5.1 und Spring Data Rest. Ich speichere meine Entitäten in einer MySQL-Datenbank und stufe sie über REST mit PagingAndSortingRepository von Spring ab. Ich fand this, die besagt, dass die Sortierung nach verschachtelten Parametern unterstützt wird, aber ich kann keine Möglichkeit finden, nach verschachtelten Feldern zu sortieren.Spring Data Rest - nach verschachtelter Eigenschaft sortieren

Ich habe diese Klassen:

@Entity(name = "Person") 
@Table(name = "PERSON") 
public class Person { 
    @ManyToOne 
    protected Address address; 

    @ManyToOne(targetEntity = Name.class, cascade = { 
     CascadeType.ALL 
    }) 
    @JoinColumn(name = "NAME_PERSON_ID") 
    protected Name name; 

    @Id 
    protected Long id; 

    // Setter, getters, etc. 
} 

@Entity(name = "Name") 
@Table(name = "NAME") 
public class Name{ 

    protected String firstName; 

    protected String lastName; 

    @Id 
    protected Long id; 

    // Setter, getters, etc. 
} 

Wenn zum Beispiel unter Verwendung des Verfahrens:

Page<Person> findByAddress_Id(@Param("id") String id, Pageable pageable); 

Und Aufruf der URI http://localhost:8080/people/search/findByAddress_Id?id=1&sort=name_lastName,desc wird die Sortierparameter von Spring völlig ignoriert.

Die Parameter sort = name.lastName und sort = nameLastName auch nicht funktioniert.

Bilde ich die Ruheanforderung falsch oder fehlt eine Konfiguration?

Vielen Dank!

+2

name.lastName wäre die zu verwendende Eigenschaft. Das Sortieren nach verschachtelten Eigenschaften funktioniert für mich in der Hopper-Version gut, aber ich habe den folgenden Fehler in einer RC-Version der Ingalls-Version festgestellt. Dies wird als behoben gemeldet, aber ich habe es nicht versucht. https://jira.spring.io/browse/DATAREST-976?jql=text%20~%20%22sort%20nested%22%20ORDER%20BY%20created%20DESC –

+0

@AlanHay Sie sind der 'Mann', arbeiten mit Ich nach dem Downgrade auf Hopper Release ' 1.10.10.RELEASE 2.5.10.RELEASE ' –

+0

@AlanHay Übrigens habe ich [' v3.0.0.M3'] (http://docs.spring.io/spring-data/rest/docs/3.0.0. M3/changelog.txt), die das gemeldet haben, aber nicht mit mir arbeiten. –

Antwort

1

Ich debuggte durch und es sieht aus wie das Problem, das Alan erwähnt.

fand ich Abhilfe, die helfen könnten:

erstellen eigene Controller, injizieren Ihre Repo- und optional Projektion Fabrik (wenn Sie benötigen Projektionen). Implementieren Sie get-Methode, um den Aufruf an Ihr Repository zu delegieren

Dies funktioniert für mich mit 2.6.8.RELEASE; Das Problem scheint in allen Versionen zu sein.

+0

Diese Lösung hat funktioniert. Vielen Dank. –

0

Die Problemumgehung, die ich fand, besteht darin, eine zusätzliche schreibgeschützte Eigenschaft nur für Sortierzwecke zu erstellen. Aufbauend auf dem Beispiel oben:

@Entity(name = "Person") 
@Table(name = "PERSON") 
public class Person { 

    // read only, for sorting purposes only 
    // @JsonIgnore // we can hide it from the clients, if needed 
    @RestResource(exported=false) // read only so we can map 2 fields to the same database column 
    @ManyToOne 
    @JoinColumn(name = "address_id", insertable = false, updatable = false) 
    private Address address; 

    // We still want the linkable association created to work as before so we manually override the relation and path 
    @RestResource(exported=true, rel="address", path="address") 
    @ManyToOne 
    private Address addressLink; 

    ... 
} 

Der Nachteil für die vorgeschlagene Abhilfe ist, dass wir nun explizit alle Eigenschaften duplizieren, für die wir verschachtelte Sortierung unterstützen wollen.

SPÄTER BEARBEITEN: Ein weiterer Nachteil ist, dass wir die eingebettete Eigenschaft von den Clients nicht verbergen können. In meiner ursprünglichen Antwort habe ich vorgeschlagen, dass wir @JsonIgnore hinzufügen können, aber anscheinend bricht das die Sorte.

Verwandte Themen