使用 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;
【问题讨论】:
limit
和 offset
没有 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 嵌入式数据库不返回正确的结果的主要内容,如果未能解决你的问题,请参考以下文章