Oracle
 sql >> Datenbank >  >> RDS >> Oracle

MyBatis RowBounds schränkt Abfrageergebnisse nicht ein

Mybatis überlässt viele Dinge dem SQL driver das verwendet wird, und es zeigt das genaue Verhalten rund umRowBounds ist einer davon.

Siehe http://mybatis.github.io/mybatis-3/java-api.html, insbesondere den Abschnitt, in dem es heißt:

Unterschiedliche Treiber können dabei unterschiedliche Wirkungsgrade erreichen. Verwenden Sie für die beste Leistung die Ergebnismengentypen SCROLL_SENSITIVE oder SCROLL_INSENSITIVE (mit anderen Worten:notFORWARD_ONLY).

Der Standardwert ist anscheinend UNSET , aber Sie könnten versuchen, SCROLL_SENSITIVE zu verwenden als ResultSetType -Attribut im select markieren und sehen, ob das hilft. Weitere Informationen dazu finden Sie unter http://mybatis.github.io/mybatis-3/sqlmap-xml.html.

Wenn das nicht funktioniert, können Sie das Problem jederzeit umgehen, indem Sie auf die Verwendung von RowBounds verzichten und implementieren Sie eine SettingsBean Klasse (oder ähnlich), die Sie select Tag als parameterType annehmen würde , und die Felder für den offset enthält und limit (oder vielleicht rowStart und rowEnd für Oracle sinnvoller , und dann können Sie diese zur Laufzeit nach Bedarf setzen und zum Zeitpunkt der select dynamisch in die SQL interpolieren wird ausgeführt.

Mit etwas mehr Code können Sie das Verhalten durch reines dynamisches SQL genau so steuern, wie Sie es möchten. Ich habe einen solchen Ansatz mit Mybatis verwendet und Postgres und es hat gut funktioniert.

Sie würden also Ihr SettingsBean implementieren Klasse mit diesen Feldern und ihren Gettern und Settern und Ihrer select Die Anweisung könnte dann etwa so aussehen:

<select
  id="selectFoo"
  parameterType="com.foo.bar.SettingsBean">

select *
from foo
where rownum >= #{rowStart}
  and rownum < #{rowEnd}
</select>