2010-12-07 12 views

Antwort

2

Verschieben Sie die Daten aus dem ResultSet in die gewünschte Objektdarstellung und sortieren Sie die Daten dann genau wie alle anderen Daten an diesem Punkt.

Wenn Sie Collections.Sort verwenden, um Ihre Sortierung für ein komplexes Objekt durchzuführen, müssen Sie Comparator implementieren.

9

die Ergebnisse in eine List<YourResultType> Extrakt und Collections.sort() verwenden. Wenn Sie nur in einer "natürlichen" Reihenfolge sortieren müssen, implementieren Sie Comparable<T> im Ergebnistyp selbst ... andernfalls implementieren Sie Comparator<T> einmal pro Sortierreihenfolge und übergeben Sie eine Instanz des entsprechenden Komparators an Collections.sort().

+0

wie lege ich es wieder in rs? Ich habe eine Menge Dinge, rs anrufend, und ich kann nicht ändern, dass ich rs brauche, um zu bleiben, wie es ist, aber sortierte – code511788465541441

+5

@ user521180: Sie nicht. Redesign Ihrer Lösung Es ist schon schlimm genug, dass Sie die Datenbank nicht für einen der Jobs verwenden können, für die sie entworfen wurde ... –

+0

Wie man es in RS zurücksetzt: Sie können ein CachedRowSet verwenden, das ResultSet implementiert. Das manuelle Einlesen der Einträge ist jedoch etwas archaisch. Es kann trotzdem getan werden. –

7

Sie tun ORDER BY in der DB.

Sie sollten warum Sie können dies nicht tun. Wenn jemand fragte "Wie setze ich eine Schraube mit einem Hammer ein? Ich kann übrigens keinen Schraubenzieher benutzen", wäre es unverantwortlich, sie nicht davon zu überzeugen, dass der Schraubenzieher in erster Linie die richtige Lösung war.

Wenn Sie wirklich, wirklich kann nicht die Ergebnismenge nativ bestellen, haben Sie kein Glück. Es ist nur ein Stream von der Datenbank, also müssten Sie alles in eine temporäre List lesen, diese Sammlung sortieren und dann von dort gehen. Für kleine Ergebnismengen ist dies wahrscheinlich kein Problem, aber für große Ergebnismengen dürfte dies die Effizienz stark beeinträchtigen.

+0

Wie lege ich es wieder in rs, nachdem ich es in der Temp-Liste sortiert habe? – code511788465541441

+1

Sie ** können nicht ** zurück in das 'ResultSet' setzen. Das ResultSet ist definitionsgemäß die Zeilen, die von Ihrer SELECT-Anweisung zurückgegeben werden * in der Reihenfolge, in der sie von der SELECT-Anweisung zurückgegeben werden *. Es klingt, als hätten Sie ein architektonisches Problem, da Sie dies nicht tun sollten. Sobald Sie es in Ihrer "Liste" haben, warum nicht weiter die Elemente direkt verwenden? –

+1

Ein Grund, warum ich feststellen konnte, dass SQL ORDER BY nicht sortiert werden kann, ist, dass keine Datenbanken die natürliche Sortierung unterstützen. –

0

Es sieht so aus, als müssten Sie für die Implementierung der ResultSet-Schnittstelle mit einem benutzerdefinierten Objekt verantwortlich sein, das Ihnen die Funktionalität bietet, die Sie suchen .... sorry.

0

Dies kann in der Abfrage selbst gelöst werden. Sie bestellen nach einer berechneten Spalte. Ihre berechnete Spalte konvertiert den natürlichen Wert in einen Wert, der numerisch oder alphabetisch sortiert werden kann. Sie könnten eine "convert" -Funktion definieren und diese Funktion in der order by-Klausel aufrufen.

Auf einer bestimmten Ebene muss die Konvertierung von natürlich nach numerisch in Ihrem Code oder in der Datenbank geschehen. Ein Algorithmus ist ein Algorithmus, egal wo er läuft.

+0

Wenn Ihre Datenbank keine Funktionen unterstützt, können Sie mit einer "case-Anweisung" bestellen. Sie können sich bei booleschen Überprüfungen in die Konvertierungslogik schleichen. Fuction ist die bessere Lösung. Aber die Lösung, nach der Sie suchen, ist ohne Zweifel möglich. – mike

+0

Hier ist ein verrücktes Beispiel für SQLServer, das gerade Zahlen auf der Oberseite, Chancen auf der Unterseite sortiert. (nur als ein natürliches Sortierbeispiel) Wählen Sie * von SomeTable Auftrag von Fall wenn (SomeNumber% 2) = 0 dann 0 \t \t \t else 1 Ende – mike

1

Es ist möglich, es vor dem Ausführen der Abfrage in der Datenbank zu sortieren und dann in resultSet zu speichern.

SELECT * FROM tableName ORDER BY columnName ASC

Ist so etwas wie dieses, die Sie wollen?