Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

MyBatis RowBounds não limita os resultados da consulta


Mybatis deixa muitas coisas para o SQL driver que está sendo usado, e aparece o comportamento exato em torno de RowBounds é um desses.

Veja http://mybatis.github.io/mybatis-3/java-api.html, particularmente a seção que diz:

Diferentes motoristas são capazes de atingir diferentes níveis de eficiência nesse sentido. Para obter o melhor desempenho, use os tipos de conjunto de resultados de SCROLL_SENSITIVE ou SCROLL_INSENSITIVE (em outras palavras:notFORWARD_ONLY).

O padrão é aparentemente UNSET , mas você pode tentar usar SCROLL_SENSITIVE como o ResultSetType atributo no select marque e veja se isso ajuda. Veja http://mybatis.github.io/mybatis-3/sqlmap-xml.html para mais informações sobre isso.

Se isso não funcionar, você sempre pode contornar o problema descartando o uso de RowBounds e implementar um SettingsBean classe (ou similar) que seu select tag tomaria como um parameterType , e que contém campos para o offset e limit (ou talvez rowStart e rowEnd fazer mais sentido para Oracle , e então você pode defini-los em tempo de execução conforme necessário e interpolá-los dinamicamente no SQL no momento em que select É executado.

Com um pouco mais de código, você controla o comportamento exatamente como deseja por meio de SQL dinâmico puro. Eu usei uma abordagem como esta com Mybatis e Postgres e tem funcionado bem.

Então você implementaria seu SettingsBean class com esses campos e seus getters e setters, e seu select declaração pode então ser algo como:
<select
  id="selectFoo"
  parameterType="com.foo.bar.SettingsBean">

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