gpt4 book ai didi

sql - MyBatis RowBounds 不限制查询结果

转载 作者:行者123 更新时间:2023-12-04 17:07:35 26 4
gpt4 key购买 nike

我正在开发一个需要支持分页的无状态 API。

我使用 Oracle 数据库。
我使用 Spring 和 MyBatis 进行数据库访问。

从文档中,我了解到我可以使用 RowBounds 类来限制查询返回的行数。

但是,似乎没有对查询进行特殊优化以支持分页。

例如,如果我将 RowBounds 设置为偏移 100 的 50 条记录,我希望查询添加以下内容:

(original query with the where clause...)
and ROWNUM < 150
and ROWNUM >= 100

但是那里什么都没有,只是我手动定义的查询。

这对性能来说很糟糕,因为我可能有几千个结果。

我究竟做错了什么?

谢谢。

最佳答案

Mybatis将许多事情留给 SQL driver正在使用,它似乎与 RowBounds 周围的行为完全一致是其中之一。

http://mybatis.github.io/mybatis-3/java-api.html ,特别是说:

Different drivers are able to achieve different levels of efficiency in this regard. For the best performance, use result set types of SCROLL_SENSITIVE or SCROLL_INSENSITIVE (in other words: not FORWARD_ONLY).



默认显然是 UNSET ,但您可以尝试使用 SCROLL_SENSITIVEResultSetType select 中的属性标记,看看是否有帮助。见 http://mybatis.github.io/mybatis-3/sqlmap-xml.html有关更多信息。

如果这不起作用,您始终可以通过放弃使用 RowBounds 来解决该问题。并实现 SettingsBean 您的 select 的类(或类似的)标签将作为 parameterType ,其中包含 offset 的字段和 limit (或者 rowStartrowEndOracle 更有意义,然后您可以根据需要在运行时设置它们,并在执行 select 时将它们动态插入到 SQL 中。

虽然代码有点多,但您可以通过纯动态 SQL 完全按照自己的意愿控制行为。我在 Mybatis 中使用了这样的方法和 Postgres它运作良好。

所以你会实现你的 SettingsBean 使用这些字段及其 getter 和 setter 进行类,以及您的 select语句可能看起来像:
<select
id="selectFoo"
parameterType="com.foo.bar.SettingsBean">

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

关于sql - MyBatis RowBounds 不限制查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24301787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com