MyBatis RowBounds nicht beschränken, query-Ergebnisse
Ich entwickle eine zustandslose API, muss die Paginierung unterstützt.
Ich eine Oracle-Datenbank verwenden.
Ich benutze Feder mit MyBatis für den Datenbank-Zugriff.
Aus der Dokumentation, verstehe ich, dass ich das RowBounds Klasse, um die Anzahl der von der Abfrage zurückgegebenen Zeilen.
Allerdings scheint es, dass es keine spezielle Optimierung durchgeführt, um die Abfrage zu unterstützen Paginierung.
Zum Beispiel, wenn ich RowBounds offset 100 mit 50 Datensätzen, würde ich erwarten, dass die Abfrage auf die folgenden Hinzugefügt:
(original query with the where clause...)
and ROWNUM < 150
and ROWNUM >= 100
Aber da ist nichts, es ist nur die Abfrage, die ich manuell festgelegt.
Dies ist schrecklich für die Leistung, da könnte ich mehrere tausend Ergebnisse.
Was mache ich falsch?
Dank.
InformationsquelleAutor odedia | 2014-06-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mybatis
lässt viele Dinge auf, dieSQL driver
verwendet wird, und es scheint das genaue Verhalten umliegendenRowBounds
ist einer von denen.Sehen http://mybatis.github.io/mybatis-3/java-api.html, besonders den Abschnitt, der sagt:
Die Standardeinstellung ist offenbar
UNSET
, aber könnten Sie versuchen, zu verwendenSCROLL_SENSITIVE
alsResultSetType
Attribut in derselect
tag und sehen, ob das hilft. Sehen http://mybatis.github.io/mybatis-3/sqlmap-xml.html für mehr info auf das.Wenn das nicht funktioniert, können Sie immer das Problem umgehen, durch Notwasserung die Verwendung von
RowBounds
und Umsetzung einer SettingsBean - Klasse (oder ähnlich), dass Ihreselect
tag dauern würde, alsparameterType
, und die enthält Felder für dieoffset
undlimit
(oder vielleichtrowStart
undrowEnd
mehr Sinn machen fürOracle
, und dann können Sie diese zur Laufzeit als erforderlich und interpolieren Sie dynamisch in das SQL zum Zeitpunkt derselect
ausgeführt wird.Zwar ein bisschen mehr code, die Sie bekommen, um das Verhalten genau so, wie Sie wollen, durch die rein dynamischen SQL. Benutzt habe ich einen Ansatz, wie dies mit
Mybatis
undPostgres
und es hat gut funktioniert.So würden Sie implementieren Ihre SettingsBean Klasse mit denen Felder und deren Getter und setter, und Ihre
select
- Anweisung könnte dann so Aussehen:Sicher, kein problem. In der Theorie, auch in eine zustandslose Anwendung, könnte es funktionieren-es würde einfach sein müssen, sequentiellen Abfragen mit verschiedenen
offset
s in Verbindung mit einemlimit
. Aber es würde wirklich davon abhängen, wie dieOracle
- Treiber verarbeitet, als die Anzahl der Zeilen zu Holen, auf einmal liegt, mit derJDBC
Schicht, die wiederum eine Reihe von Abhängigkeiten zu den einzelnen Treibern (Oracle
,Postgres
usw.). Ich Stimme zu, die es gemacht ist einfacher, als es ist. Ich habe festgestellt, dass das auch der Fall sein mitMybatis
wenn es um die Mapper für komplexere Typen, wie String-arrays.InformationsquelleAutor khampson
Fand ich eine einfache Arbeit rund um dieses Thema. Ich hatte nach der Mybatis Anweisungen @khampson empfohlen, und Sie war vorbei, ein RowBounds Instanz der mapper ohne Grenzen durchgesetzt.
mapper java
mapper xml -
einfach Anhängen von "LIMIT #{param1.offset}, #{param1.limit}" der mapper xml erzeugt das Verhalten, das ich wollte!!!
InformationsquelleAutor BoatCode
Getestet habe ich auf Postgres-Datenbank und Paginierung von AngularUI. Die erste Seite N°1, wenn Sie die call-Seite N°0, die Dienste wieder alle Daten.
java-Service:
java-Mapper:
xml-Mapper:
InformationsquelleAutor sgrillon