Mybatis để lại nhiều thứ cho SQL driver đang được sử dụng và nó xuất hiện hành vi chính xác xung quanh RowBounds là một trong số đó.
Xem https://mybatis.github.io/mybatis-3/java-api.html, đặc biệt là phần có nội dung:
Các trình điều khiển khác nhau có thể đạt được các mức hiệu quả khác nhau về vấn đề này. Để có hiệu suất tốt nhất, hãy sử dụng loại tập hợp kết quả làSCROLL_SENSITIVE hoặc SCROLL_INSENSITIVE (nói cách khác:notFORWARD_ONLY).
Giá trị mặc định rõ ràng là UNSET , nhưng bạn có thể thử sử dụng SCROLL_SENSITIVE dưới dạng ResultSetType trong select gắn thẻ và xem nếu điều đó có ích. Xem https://mybatis.github.io/mybatis-3/sqlmap-xml.html để biết thêm thông tin về điều đó.
Nếu điều đó không hiệu quả, bạn luôn có thể khắc phục sự cố bằng cách bỏ sử dụng RowBounds và triển khai Cài đặtBean lớp (hoặc tương tự) mà select thẻ sẽ có dạng parameterType và chứa các trường cho offset và limit (hoặc có thể là rowStart và rowEnd có ý nghĩa hơn đối với Oracle và sau đó bạn có thể đặt chúng trong thời gian chạy nếu cần và nội suy động chúng vào SQL tại thời điểm select được thực thi.
Trong khi mã nhiều hơn một chút, bạn có thể kiểm soát hành vi chính xác như bạn muốn thông qua SQL động thuần túy. Tôi đã sử dụng cách tiếp cận như thế này với Mybatis và Postgres và nó đã hoạt động tốt.
Vì vậy, bạn sẽ triển khai Cài đặtBean của mình lớp với các trường đó và getters và setters của chúng, và select của bạn sau đó câu lệnh có thể trông giống như sau:
<select
id="selectFoo"
parameterType="com.foo.bar.SettingsBean">
select *
from foo
where rownum >= #{rowStart}
and rownum < #{rowEnd}
</select>