Frage

Wie implementiere ich Paging in den Ruhezustand? Die Query Objekte haben Methoden genannt setMaxResults und setFirstResult die sicherlich hilfreich sind. Aber wo kann ich die Gesamtzahl der Ergebnisse zu erhalten, so dass ich Link zur letzten Seite der Ergebnisse zeigen und drucken Dinge wie Ergebnisse 200 bis 250 von xxx

War es hilfreich?

Lösung

Sie können mit Query.setMaxResults (int Ergebnisse) und Query.setFirstResult (int offset).

Bearbeiten zu: Es gibt keine Möglichkeit zu wissen, wie viele Ergebnisse Sie erhalten. Also, müssen Sie zuerst mit "select count (*) ..." abfragen. Ein wenig hässlich, IMHO.

Andere Tipps

Sie müssen eine separate Abfrage tun, um die max Ergebnisse zu erhalten ... und in dem Fall, dass zwischen dem Zeitpunkt A der ersten Zeit, um eine Paging-Anforderung zu Zeit B der Client ausgibt, wenn eine andere Anforderung ausgegeben wird, wenn neue Datensätze hinzugefügt oder einige Datensätze passen jetzt die Kriterien, dann müssen Sie wieder die maximale Abfrage so zu reflektieren. Ich tue dies in der Regel in HQL wie diese

Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult();

für Criteria Abfragen ich in der Regel meine Daten in ein DTO wie diese schieben

ScrollableResults scrollable = criteria.scroll(ScrollMode.SCROLL_INSENSITIVE);
if(scrollable.last()){//returns true if there is a resultset
    genericDTO.setTotalCount(scrollable.getRowNumber() + 1);
    criteria.setFirstResult(command.getStart())
            .setMaxResults(command.getLimit());
    genericDTO.setLineItems(Collections.unmodifiableList(criteria.list()));
}
scrollable.close();
return genericDTO;

könnten Sie zwei Abfragen durchführen - ein count (*) gibt Abfrage, die billig sein soll, wenn Sie nicht zu viele Tabellen miteinander zu verbinden sind, und eine zweite Abfrage, die die Grenzen gesetzt hat. Dann wissen Sie, wie viele Elemente vorhanden, aber nur diejenigen, greifen betrachtet wird.

Sie können setMaxResults nur auf die maximale Anzahl der Zeilen zurückgegeben werden sollen. Es gibt keinen Schaden in diesen Wert größer als die Anzahl der tatsächlichen Zeilen Einstellung zur Verfügung. Das Problem der anderen Lösungen ist, dass sie davon ausgehen, die Reihenfolge der Datensätze gleich bleibt jeder Wiederholung der Abfrage, und es gibt keine Änderungen zwischen den Befehlen geht.

Um zu vermeiden, dass, wenn Sie wirklich durch Ergebnisse blättern wollen, ist es am besten ist es, die ScrollableResults zu verwenden. Sie dieses Objekt nicht entfernt zwischen Paging werfen, aber es verwenden, um die Datensätze in der gleichen Reihenfolge zu halten. Um die Anzahl der Datensätze aus dem ScrollableResults zu finden, können Sie einfach auf die letzte Position () bewegen, und dann die Zeilennummer erhalten. Denken Sie daran, 1 auf diesen Wert hinzuzufügen, da Zeilennummern Zählung bei 0 beginnen.

Ich persönlich denke, sollten Sie den Paging in der Front-End-Griff. Ich weiß, dass dies nicht das effizient, aber zumindest wäre es weniger fehleranfällig sein.

Wenn Sie die Zählung verwenden würden (*), was, was passieren würde, wenn Datensätze aus der Tabelle gelöscht werden zwischen Anfragen für eine bestimmte Seite? Viele Dinge könnten falsch diesen Weg gehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top