JDBC-ResultSet-Zeilen Gesamt
Ich bin für die Implementierung von Paging in meiner Anwendung. Dafür habe ich eine Abfrage ausführen und erhalte ein ResultSet.
Jetzt möchte ich, um insgesamt die Anzahl der Datensätze in dieser Ergebnismenge, die für meine paging-Berechnung.
Wie bekomme ich diese ? Ich will nicht extra ausführen von SQL, die mich total Zeilen.
- Einfach nur neugierig, ist dies eine web-Anwendung? Wenn wir sprechen hier nicht über 1000+ Datensätze aus der Abfrage, können Sie sehr leicht implementieren Sie eine java-Skript-Paginierung, und vermeiden Sie getroffen haben, das backend für jede Seite.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andere option ist, um den count-aggregation als sub abgefragt Spalte in Ihre Abfrage. Wenn Ihre Datenbank ist gerade ein wenig schlau, es wird nur führen, dass, sobald. Sie sollten in der Lage sein zu überprüfen, diese einfach mit der query-analyzer in Ihrem Lieblings-Datenbank.
Den normalen Praxis ist die Karte der
ResultSet
zu einemList<Entity>
woEntity
ist ein javabean repräsentiert die eigentlichen Daten, z.B.User
,Product
,Order
usw.Dann können Sie nur verwenden
List
Methoden wieList#size()
erhalten Sie die Zeilenanzahl.COUNT(*)
(oder besserCOUNT(pk)
) und anderen, um die Zeilen von Interesse. Obwohl pribably nicht voll geeignet für Ihre Anforderung (JSF Webapplikation), erhalten Sie möglicherweise einige nützliche Erkenntnisse aus der diesem Artikel.Wenn ich mich nicht Irre, ist das Standardverhalten für ein ResultSet nicht an, um alle Zeilen auf einmal, so gibt es keine Möglichkeit zu wissen, vom Objekt selbst, wie viele Zeilen zurückgegeben von der Abfrage, ohne die erste Iteration (und damit die abrufen) alle von Ihnen. Sie könnten ein anderes Verhalten mit spezifischen JDBC-Treiber für Datenbanken.
Darf ich Fragen, warum es zu teuer ist, damit Sie einen COUNT () - Abfrage zuerst ? Im Vergleich zu den Kosten für das abrufen der aktuellen Werte, es sollte nicht zu teuer sein.
Aus einem Kommentar zu BalusC ist Antwort:
Du willst nichts, aber Fragen Sie die Datenbank für die etwa 10 Zeilen und die Größe der Tabelle. also Sie haben tatsächlich zwei (2) Fragen, um Ihre Daten zu speichern, die gleich zwei (2) select-Abfragen. Tun Sie so, als Uri vorgeschlagen und kümmern sich nicht um 'best practice'. Wenn eines Tages jemand kommt, um eine bessere Praxis, die Sie immer noch entscheiden können, ob Sie passen Sie Ihren code oder nicht.
Gibt es keinen Punkt in zähllisten Größe zu bekommen-Datensatz, wie wir die Umsetzung der Paginierung und SOLLTE NICHT geladen, die gesamte Ergebnismenge auf einmal.
Ich benutze ZEILE auf der Datenbank-Ebene zur Umsetzung der Paginierung Logik. Wir müssen das so viele Datensätze, wie wir brauchen, um es auf dem Bildschirm.
Beispiel: select * from Emp where rownum>=:beginRecord und rownum<=:endRecord
Logik wird die gleiche, aber die syntax kann sich ändern, je nachdem, bis auf den Typ der Datenbank. Müssen, verwenden Sie verschachtelte Abfrage, wenn wir tun müssen, um von einer Spalte.
Ich glaube, count(*) ist teuer, Bedienung, sondern ich bevorzuge partition.
Wählen Sie Eno, Ename , (select count(*) from emp) als record_count von Emp-Teuer
Wählen Sie Eno, Ename , count(*) over (partition by eno) als record_count von Emp -- Bevorzugten.
Partition-syntax kann sich ändern, je nachdem, bis auf den Typ der Datenbank.
Ich habe als Oracle-Datenbank.
Fühlen Sie sich frei zu kommentieren/diskutieren.
Dank & Grüße,
Lokesh Rangineni.
neben Fathah Lösung können Sie diesen code verwenden, beachten Sie auch, dass, da es eine memory-Zeiger hat diese Lösung keine performance-Probleme: