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 http://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 http://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>