2012-10-08 7 views

Antwort

10

Die PagingAndSortingRepository kommt noch hinzu, die sehr grundlegende CRUD Methoden im Paginierungsmodus. Wie die reference documentation beschreibt, können Sie einfach einen Pageable Parameter zu einer beliebigen Abfrage-Methode hinzufügen, die Sie definieren, um die Seitennummerierung dieser Abfrage zu erreichen.

interface CustomerRepository implements Repository<Customer, Long> { 

    Page<Customer> findByLastname(String lastname, Pageable pageable); 

    List<Customer> findByFirstname(String firstname, Pageable pageable); 
} 

Das erste Verfahren wird wieder eine Page die Seite Metadaten wie insgesamt verfügbaren Elemente usw. enthalten, diese Daten berechnen sie eine zusätzliche Zählerabfrage für die Abfrage abgeleitet auslöst. Die zweite Abfragemethode gibt die unverschlüsselte Ergebnismenge zurück, ohne dass die Zählabfrage ausgeführt wird.

+0

Hallo @Olivier mit dem Pageagle Ich sehe nicht, wo der Offset angegeben wird, 'PageRequest' akzeptiert nur' page' und 'size'. Ich sehe nicht wirklich, warum ich 'page * size' brauche, um meinen' offset' zu bekommen. Gibt es eine Möglichkeit, 'offset' im Gegensatz zu' page' zu ​​verwenden? –

+1

Der Grund 'PageRequest' legt' Seite' und 'Größe' offen, da nur' Offset' nicht ausreicht, da Sie immer noch die 'Größe' benötigen. Das Konzept der Paginierung impliziert normalerweise eine seitenzentrierte Sicht auf Daten, die wir hier ausdrücken. Aber nichts hindert Sie daran, eine eigene Implementierung von "Pageable" zu entwickeln, die mit Offsets und Größen funktioniert. –

+0

Wie können wir die Pagivation mit der Abfrage-API nutzen? –

2

Für Paginierung Sie 2 Methoden wie getCount benötigen (Pageable seitenwechselbar) und findAll (Pageable seitenwechselbar)

diese Funktionalität in Hibernate Verwendung ist jedoch trivial. Wenn Sie irgendeine HQL Abfrage haben, können Sie dies einfach tun:

public Long getCount(Pageable pageable) { 
    Query q = session.createQuery("Select count(t) From TableClass t where t.city = 'NY'"); 
    Long cnt = (Long) q.uniqueResult(); 
    return cnt; 
} 

public List<TableClass> findAll(Pageable pageable) { 
    Query q = session.createQuery("From TableClass t where t.city = 'NY'"); 
    q.setFirstResult(start); 
    q.setMaxResults(length); 
    List<TableClass> tableClasslist = q.list(); 
    return tableClasslist; 
} 

Ebenso, wenn Sie eine Criteria Abfrage haben, ist es effektiv das gleiche:

public Long getCount(Pageable pageable) { 
    Criteria c = session.createCriteria(TableClass.class); 
    c.setProjection(Projections.rowCount()); 
    Long cnt = (Long) c.uniqueResult(); 
    return cnt; 
} 

public List<TableClass> findAll(Pageable pageable) { 
    Criteria c = session.createCriteria(TableClass.class); 
    c.setParameter("city","NY"); 
    c.setFirstResult(start); 
    c.setMaxResults(length); 
    List<TableClass> tableClasslist = c.list(); 
    return tableClasslist ; 
} 
+0

Vielen Dank für Ihre Hilfe. Ich suchte nach einer JPA-Lösung, aber DataNucleus entfernte JPA aus den Tags der Frage. Ich habe das Hibernate-Tag verwendet, um auszudrücken, dass Hibernate mein Persistenz-Provider ist. – Mariusz