【问题标题】:H2 embedded DB does't return proper results when using LIMIT AND OFFSET使用 LIMIT AND OFFSET 时,H2 嵌入式数据库不返回正确的结果
【发布时间】: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 连接在表中有未提交的行。

标签: java jdbc h2


【解决方案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 *,则结果相同
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2023-03-19
相关资源
最近更新 更多