分页查询
分页按行号范围取出记录。页码从 0 开始,每页 20 条时,第一页取第 1–20 行,第二页取第 21–40 行。
分页语句
WITH selectTemp AS (
SELECT TOP 100 PERCENT
ROW_NUMBER() OVER (ORDER BY id) AS __row_number__,
id, name
FROM user_info
)
SELECT * FROM selectTemp
WHERE __row_number__ BETWEEN 1 AND 20
ORDER BY __row_number__
行号上下界由页码和每页条数计算后写入 SQL。
查询总数
需要总记录数时,dbVisitor 移除原查询的 ORDER BY 后另行执行:
SELECT COUNT(*) FROM (
SELECT id, name FROM user_info
) AS TEMP_T
dbVisitor 用法
List<UserInfo> rows = lambda.query(UserInfo.class)
.orderBy(UserInfo::getId)
.initPage(20, 0)
.queryForList();
initPage(每页条数, 页码) 的页码从 0 开始。需要复用分页状态时,可改用 usePage(PageObject.of(页码, 每页条数));Mapper 方法也可以接收 Page 参数。分页对象、总数读取和各 API 的接入方式见 9.5 分页。
注意事项
- 原查询的
ORDER BY用于ROW_NUMBER();排序应包含唯一的决胜列。 - 没有业务排序时使用
CURRENT_TIMESTAMP,不保证稳定翻页。 - 结果包含
__row_number__列;计数与取页也不是同一查询。
改变排序方向及多字段排序的用法见排序。