首页 > 解决方案 > H2 嵌入式 DB LIMIT + OFFSET> Integer.MAX_VALUE 导致错误结果

问题描述

我从使用 H2 SQL 查询中得到了奇怪的行为。在 Ubuntu Linux 上使用 Java8、spring-jdbc:4.3.13、h2:1.4.199。

更新:确认这是一个错误,检查答案

我有一个这样的 PERSON 表:

id | name
1  | "John"
2  | "Jane"
3  | "Frank"

当我运行这个准备好的语句时:

-- (Note ordering is descending.)
SELECT * FROM person ORDER BY id DESC LIMIT ? OFFSET ?

所以偏移量正常工作,除非我使用非常高的限制数字,在这种情况下我不知道发生了什么。

如果我尝试其他变体,例如“LIMIT ?, ?”,也一样。(并切换值)。

那么这是一个错误,还是 H2/JDBC 的已知限制?

当我对值进行硬编码时也会发生同样的情况:

SELECT * FROM person ORDER BY id DESC LIMIT 2147483646 OFFSET 2

使用 spring-jdbc 和 rowmappers 有点涉及 java 代码,所以我不能轻易地将它粘贴到这里。

标签: sqlh2

解决方案


在https://github.com/h2database/h2database/issues/2025报告并确认

此问题是由 SortOrder.sort(ArrayList, int, int) 中的溢出引起的。

解决方法是避免在不需要限制时生成 FETCH、LIMIT 或 TOP 子句。


推荐阅读