Oracle
 sql >> Base de données >  >> RDS >> Oracle

MyBatis RowBounds ne limite pas les résultats des requêtes

Mybatis laisse beaucoup de choses au SQL driver qui est utilisé, et il apparaît le comportement exact entourant RowBounds en fait partie.

Voir http://mybatis.github.io/mybatis-3/java-api.html, en particulier la section qui dit :

Différents conducteurs sont capables d'atteindre différents niveaux d'efficacité à cet égard. Pour de meilleures performances, utilisez les types d'ensembles de résultats SCROLL_SENSITIVE ou SCROLL_INSENSITIVE (en d'autres termes :notFORWARD_ONLY).

La valeur par défaut est apparemment UNSET , mais vous pouvez essayer d'utiliser SCROLL_SENSITIVE comme ResultSetType attribut dans le select tag et voir si cela aide. Voir http://mybatis.github.io/mybatis-3/sqlmap-xml.html pour plus d'informations à ce sujet.

Si cela ne fonctionne pas, vous pouvez toujours contourner le problème en abandonnant l'utilisation de RowBounds et implémentez un SettingsBean classe (ou similaire) que votre select la balise prendrait comme parameterType , et qui contient des champs pour le offset et limit (ou peut-être rowStart et rowEnd avoir plus de sens pour Oracle , puis vous pouvez les définir au moment de l'exécution selon vos besoins et les interpoler dynamiquement dans le SQL au moment où le select est exécuté.

Avec un peu plus de code, vous pouvez contrôler le comportement exactement comme vous le souhaitez grâce à du SQL dynamique pur. J'ai utilisé une approche comme celle-ci avec Mybatis et Postgres et cela a bien fonctionné.

Donc, vous implémenteriez votre SettingsBean class avec ces champs et leurs getters et setters, et votre select l'instruction pourrait alors ressembler à :

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

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