偏移量 N 获取前 M 行,JDBC 和 PostgreSQL 不起作用



我正在尝试使用JDBC和PostgreSQL进行查询,但是我面临着在任何文档中都找不到的奇怪情况。

如果我通过 pgAdmin 和 H2(我用于应用程序的单元测试)执行它,则以下查询有效,但如果通过 JDBC 执行它,则会出现语法错误:

Queries.SELECT_SQL

SELECT columns 
FROM Table 
LEFT JOIN TableToJoin1 
LEFT JOIN TableToJoin2 
LEFT JOIN TableToJoin3 
JOIN TableToJoin4

Queries.ENDING_PAGING_STATEMENT_SQL

OFFSET ? ROWS FETCH FIRST ? ROWS ONLY

SELECT查询是正确的,并且使用任何方式都可以正常工作,问题是当我将两个查询放在一起时,即SELECT语句以及OFFSETFETCH FIRST

这就是我通过JDBC执行查询的方式:

// Receive offset and limit as argument.
try (final PreparedStatement selectStatement = connection
.prepareStatement(Queries.SELECT_SQL + Queries.ENDING_PAGING_STATEMENT_SQL)) {
selectStatement.setInt(Queries.PAGING_ENDING_STATEMENT_OFFSET_ARGUMENT_POSITION, offset);
selectStatement.setInt(Queries.PAGING_ENDING_STATEMENT_LIMIT_ARGUMENT_POSITION, limit);
final ResultSet resultSet = bookSelectStatement.executeQuery();
...
}

下面是引发的异常的消息:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "$2"

如果我调用selectStatement.toString()进行调试,我将完全按预期收到查询。

如果我通过OFFSET N LIMIT M更改OFFSET N ROWS FETCH FIRST M ROWS ONLY它将通过 JDBC 正常工作。 最简单的解决方案是进行上面的简单更改,但我的部分任务是使用此FETCH FIRST M ROWS ONLY语句进行查询。

那么,你们能帮我看看我是否做错了,或者是否根本没有办法在 JDBC 上使用FETCH FIRSTfor PostgreSQL?提供一些示例或对任何有帮助的文档的一些引用。

我注意到 PostgreSQL 文档:查询 - 偏移量和限制中不存在FETCH FIRST,但由于它通过 pgAdmin 工作,我不知道为什么我在使用 JDBC 时会遇到任何问题。

非常感谢!

我可以重现这个问题。从版本 10 开始,文档说:

在此语法中,若要为 start 或 count 编写除简单整数常量之外的任何内容,必须在其周围写括号

当然,这很荒谬。绑定变量应该不带括号 - 大多数数据库都允许它们,PostgreSQL也接受OFFSET ? LIMIT ?语法,但看起来它们不在PostgreSQL对标准SQL语法的解释中。所以你必须写:

OFFSET (?) ROWS FETCH FIRST (?) ROWS ONLY

我认为这是一个错误,我已经在这里报告了

最新更新