Wie kann ich Daten sofort mit Spring Data JPA nach Sortieren und Pageable abfragen?

72

Ich versuche Spring Data JPA in meinem Projekt. Ich möchte wissen, ob es eine sofort einsatzbereite API gibt, mit der Daten sowohl von Sortals auch abgefragt werden können Pageable. Natürlich weiß ich, dass ich diese Methode selbst schreiben kann. Ich möchte nur wissen, ob es eine Out-of-the-Box-Methode gibt. Mein DAO wird erweitert JpaRepository, und ich habe festgestellt, dass ich die folgenden Methoden aufrufen kann:

findAll();
findAll(Pageable pageable);
findAll(Sort sort);

Aber es gibt keine Methode wie findAll(Sort sort, Pageable pageable), also bin ich neugierig.

Tom
quelle

Antworten:

158

Es gibt zwei Möglichkeiten, dies zu erreichen:

final PageRequest page1 = new PageRequest(
  0, 20, Direction.ASC, "lastName", "salary"
);

final PageRequest page2 = new PageRequest(
  0, 20, new Sort(
    new Order(Direction.ASC, "lastName"), 
    new Order(Direction.DESC, "salary")
  )
);

dao.findAll(page1);

Wie Sie sehen, ist das zweite Formular flexibler, da für jede Eigenschaft ( lastName ASC, salary DESC) eine andere Richtung definiert werden kann .

Tomasz Nurkiewicz
quelle
3
Das Übergeben mehrerer Spalten zum Sortieren von Daten aus Javascript durch eine REST-Steuerung kann mit den folgenden Javascript-Daten erfolgen: ['name, asc', 'location, desc']
Stephane
Danke für deine Antwort und es hat mir geholfen! Könnten Sie bitte die Reihenfolge in Sortieren ändern? Es handelt sich um Daten im Frühjahr sortieren.
neugierig1
4
Dies war meine Lösung, aber im Frühjahr ist es: Pageable pageable = new PageRequest (0, 20, neue Sortierung (neue Sort.Order (Direction.ASC, "Name"), neue Sort.Order (Direction.DESC, "Gehalt") ));
Simon
Ist der Datentyp NUMBER (Ganzzahl als JPA-Entitätstyp) als Sortierelement zulässig? In meiner Datenbank sind NUMBER-Daten gespeichert. Dies sind primäre Kennungen für Datensätze. Kann ich diese Spalte mit JPA-Unterstützung speichern?
Ketan
15

Pageable hat die Option, auch die Sortierung anzugeben. Aus dem Java-Dokument

PageRequest(int page, int size, Sort.Direction direction, String... properties) 

Erstellt eine neue PageRequest mit angewendeten Sortierparametern.

gkamal
quelle
2
Auf diese Weise legen Sie eine Sortierrichtung für alle Eigenschaften fest. Wenn Sie die Sortierrichtung nach Eigenschaften unterscheiden möchten, müssen Sie das Sortierobjekt verwenden, wie Tomasz betont hat.
Mariusz
1

Im Jahr 2020 ist die akzeptierte Antwort etwas PageRequestveraltet, da sie veraltet ist. Verwenden Sie daher den folgenden Code:

Pageable page = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by("id").descending());
return repository.findAll(page);
Sam Su
quelle
0

Spring Pageable enthält eine Sortierung. Wenn Ihre Anfrage also die Werte hat, wird eine sortierte Seite zurückgegeben.

Anfrage: domain.com/endpoint?sort=[FIELDTOSORTBY]&[FIELDTOSORTBY].dir=[ASC|DESC]&page=0&size=20

Das sollte ein sortiertes, nach Seiten sortiertes Feld zurückgeben, das in der angegebenen Reihenfolge angegeben ist.

T04435
quelle
0

In meinem Fall zu verwenden Pageableund Sortinggleichzeitig habe ich wie unten verwendet. In diesem Fall habe ich alle Elemente mit Paginierung genommen und idnach absteigender Reihenfolge sortiert:

modelRepository.findAll(PageRequest.of(page, 10, Sort.by("id").descending()))

Wie oben basierend auf Ihren Anforderungen können Sie Daten auch mit 2 Spalten sortieren.

Abdusoli
quelle
-1
 public List<Model> getAllData(Pageable pageable){
       List<Model> models= new ArrayList<>();
       modelRepository.findAllByOrderByIdDesc(pageable).forEach(models::add);
       return models;
   }
Nazrul Kabir
quelle
2
Bitte kommentieren Sie den Code, auch wenn er selbsterklärend ist.
Andronicus
2
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Wai Ha Lee