13 條記錄,頁面大小 4 → 應 4 頁。原代碼計算 `abs = (i-1)*pageSize+1`,第 4 頁 `abs=13`,但 `rs.absolute(13)` 拋出異常,原因是 ResultSet 游標從 1 開始,最大合法值為記錄總數(13),理論上合法,但具體驅動實現可能不支持跳轉到最後一條之後的位置,或游標類型非 `TYPE_SCROLL_INSENSITIVE`。
-- MySQL
SELECT * FROM billRec
WHERE date BETWEEN '2015-09-15' AND '2015-09-30'
ORDER BY date
LIMIT ?, ?; -- offset, pageSize
-- Oracle 12c+
SELECT * FROM (
SELECT a.*, ROWNUM rn FROM (
SELECT * FROM billRec WHERE date BETWEEN ... ORDER BY date
) a WHERE ROWNUM <= ?
) WHERE rn > ?;
List all = fetchAll(); // 一次性查出
int pageSize = 4;
int total = all.size();
int pageCount = (total + pageSize - 1) / pageSize;
for (int i = 1; i <= pageCount; i++) {
int from = (i - 1) * pageSize;
int to = Math.min(from + pageSize, total);
List pageData = all.subList(from, to);
// 輸出 pageData
}
WITH RECURSIVE dates(d) AS (
SELECT '2015-09-15' UNION ALL
SELECT DATE_ADD(d, INTERVAL 1 DAY) FROM dates WHERE d < '2015-09-30'
)
SELECT d.date,
COALESCE(b.money, 0) AS money,
COALESCE(b.num, 0) AS num
FROM dates d
LEFT JOIN billRec b ON b.date = d.date
ORDER BY d.date;
(MySQL 8.0+ / PostgreSQL / SQL Server 支持 CTE 遞歸)