2015-05-19 6 views
7

Ich wollte die letzten 5 Datensätze einer Entität abrufen. Kann aber nicht über Spring Data JPA abgerufen werden.Spring Data JPA, wie man die letzte Seite durch Auslagerungs

Anfangs versuchte ich, die Daten über LIMIT-Abfrage zu erhalten, aber LIMIT wird in JPA nicht unterstützt.

Später versuchte ich mit Pageable Schnittstelle.

Pageable pageCount = new PageRequest(0, 10, Direction.ASC,"id"); 
List<TxnEntity> txnEntities = txnDAO 
      .findByAccountEntity(accountEntity,pageCount); 

Dies gibt mir die erste Seite mit 10 Objekten.

Aber meine Anforderung ist, die letzten 10 oder 5 Objekte zu bekommen. Wie kann ich es über die Schnittstelle Pageable im Spring-Framework bekommen?

+0

Bestimmen Sie zunächst die Gesamtmenge, subtrahieren Sie die Anzahl der benötigten Datensätze und konstruieren Sie ein Objekt. –

+2

'Seitenwechsel pageCount = new PageRequest (0, 10, Direction.DESC, 'Id');'? – redge

Antwort

3

Der Ausgang ich erwartet hatte letzten n Datensätze war.

So habe ich die Spring Data JPA 1.7 integrierte Abfrage

int n = 10; 

Pageable pageCount = new PageRequest(0, n); 

List<TxnEntity> txnEntities = txnDAO 
     .findByAccountEntityOrderByIdDesc(accountEntity,pageCount); 

Jetzt wird diese Rückkehr letzten n Datensätze verwendet.

Das DAO wird alle Datensätze in absteigender Reihenfolge zurückgeben, und mithilfe von Auslagerungsdatei können wir wie viele Datensätze von unten benötigen.

Es war einfach.

Weitere JPA Query eingebaute Anfragen: http://docs.spring.io/spring-data/jpa/docs/current/reference/html/

0

Sie könnten Ihre Art umkehren und erhalten dann die erste 5.

3

Von der Referenzdokumentation:

Um herauszufinden, wie viele Seiten Sie für eine Abfrage erhalten völlig müssen Sie ein auslösen zusätzliche Zählabfrage Standardmäßig wird diese Abfrage von der Abfrage abgeleitet, die Sie tatsächlich auslösen.

Sie können die Anzahl der Seiten bestimmen, indem eine Abfrage der Anzahl im Voraus Ausgabe:

Long count = txnDAO.countByAccountEntity(accountEntity); 
Pageable pageCount = new PageRequest((int)count/10, 10, Direction.ASC,"id"); 
+0

Die obige Lösung funktioniert nur, wenn die Anzahl genau 10 ist. zB if wenn count 30 dann werde ich pageRequest as (Anzahl: 3, Größe: 10, Direction.ASC, "id"); was mir 10 Objekte gibt, wie erwartet ist die letzte 10. aber ii. wenn count 27 ist dann bekomme ich pageRequest as (Nummer: 2, Größe: 10, Direction.ASC, "id"); was mir nur 7 Elemente gibt, aber erwartet ist die letzte 10. – virsha

0

Nur für das Bezug:

Per http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-query-result

können Sie auch eine Methode findTop5ByAccountEntityOrderByIdDesc(accountEntity) in Ihrem Repository erstellen. Ich würde das von der Lösung mit der zusätzlichen Zählungsabfrage bevorzugen.

Wenn Sie möchten, können Sie auch den Parameter Auslagerbare hinzufügen, aber es macht nicht viel Sinn.

Es gibt jedoch mehrere mögliche Probleme dort: ID ist keine natürliche Möglichkeit, die "letzten" Einträge zu finden. Es wird immer das gleiche Ergebnis liefern, aber abhängig von der Generierungsstrategie und davon, wie IDs möglicherweise zwischengespeichert werden, ist nicht garantiert, dass die letzte "gespeicherte" Entität die höchste ID hat. Dies könnte in 90% der Fälle funktionieren, aber Sie sollten dort vorsichtig sein.

Ist das, was Sie vorhatten?