我正在尝试使用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
语句以及OFFSET
和FETCH 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 FIRST
for PostgreSQL?提供一些示例或对任何有帮助的文档的一些引用。
我注意到 PostgreSQL 文档:查询 - 偏移量和限制中不存在FETCH FIRST
,但由于它通过 pgAdmin 工作,我不知道为什么我在使用 JDBC 时会遇到任何问题。
非常感谢!
我可以重现这个问题。从版本 10 开始,文档说:
在此语法中,若要为 start 或 count 编写除简单整数常量之外的任何内容,必须在其周围写括号
当然,这很荒谬。绑定变量应该不带括号 - 大多数数据库都允许它们,PostgreSQL也接受OFFSET ? LIMIT ?
语法,但看起来它们不在PostgreSQL对标准SQL语法的解释中。所以你必须写:
OFFSET (?) ROWS FETCH FIRST (?) ROWS ONLY
我认为这是一个错误,我已经在这里报告了