使用 LIMIT AND OFFSET 时,H2 嵌入式数据库不返回正确的结果

Posted

技术标签:

【中文标题】使用 LIMIT AND OFFSET 时,H2 嵌入式数据库不返回正确的结果【英文标题】:H2 embedded DB does't return proper results when using LIMIT AND OFFSET 【发布时间】:2018-05-09 12:11:46 【问题描述】:

我正在使用以下查询对我的表格进行分页。

select * 
from TABLE_NAME 
LIMIT 4 OFFSET 10

我的表有 12 行。当我从 Squirrel 运行这个查询时,它会返回响应,但是当我使用 JDBC 连接来获取它时,它不会返回数据。

如果我使用 LIMIT AS 14 AND OFFSET 4,相同的查询可以正常工作。(我的 JDBC 没有问题)。

Java 代码:

List<DataPoolEntity> list = new ArrayList<>();
try 

    String fetch = "select * from TABLENAME LIMIT " + limit + " OFFSET " + offset;


    java.sql.PreparedStatement stmt = conn.prepareStatement(fetch);

    java.sql.ResultSet result = stmt.executeQuery();

    list = generateDataPoolEntityList(result); (custom code) - ignore this
    result.close();
    stmt.close();
    return list;
 catch (SQLException e) 
    e.printStackTrace();

return null;

【问题讨论】:

limitoffset 没有 order by 是没有意义的 - 难怪你没有得到你所期望的。如果它在您的 Java 代码中不起作用,您还必须向我们展示 Java 代码。 我也有订单,我的完整查询:select * from TABLE_NAME LIMIT 4 OFFSET 10 ORDER BY ID 未返回数据(或未返回数据),通常意味着您正在连接到不同的数据库,或者您正在查看在当前事务中创建且尚未提交的数据,因此对其他事务不可见。另外,如果我使用 LIMIT AS 14 AND OFFSET 4,“工作正常” 是什么意思?如图所示,子句是语法错误。 我的实际查询:select * from TABLE_NAME ORDER BY ID LIMIT 4 OFFSET 10 在 Squirrel(基于 JDBC)或直接在 JDBC 中运行查询没有区别。您可能正在连接到不同的数据库/数据集,或者您的 Squirrel 连接在表中有未提交的行。 【参考方案1】:

Order by 应该在limit 之前。 See the specification.

【讨论】:

在限制之前:select * from TABLE_NAME ORDER BY ID LIMIT 4 OFFSET 1 您确定 ResultSet 是空的吗?试试... java.sql.ResultSet result = stmt.executeQuery(); result.last(); System.out.println(result.getRow()); ... 如果我使用 SELECT *,则结果相同

以上是关于使用 LIMIT AND OFFSET 时,H2 嵌入式数据库不返回正确的结果的主要内容,如果未能解决你的问题,请参考以下文章

mysql 证明为啥用limit时,offset很大会影响性能

mysql的OFFSET实现分页

limit 与offset的用法(转载)

mysql用limit时offset越大时间越长

sql 中 limit 与 limit,offset连用

Codeigniter 分页避免使用 OFFSET 限制