微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – OFFSET N FETCH FIRST M ROWS,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语句以及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行,它将通过JDBC工作而没有任何问题.
最简单的解决方案将在上面进行简单的更改,但我的任务的一部分是使用此FETCH FirsT M ROWS ONLY语句进行查询.

那么,你们可以帮助我看看我做错了,还是根本没有办法在JDBC上使用FETCH FirsT for Postgresql?通过一些示例或对任何有用的文档的一些引用.

我注意到PostgreSQL Documentation: Queries – Offset and Limit上不存在FETCH FirsT,但由于它通过pgAdmin工作,我不知道为什么我在使用JDBC时会遇到任何问题.

非常感谢!

解决方法:

我可以重现这个问题.从版本10开始,documentation说:

In this Syntax, to write anything except a simple integer constant for start or count, you must write parentheses around it

当然,这很荒谬.应该允许绑定变量没有括号 – 大多数数据库允许它们和OFFSET?限制? Postgresql也接受语法,但它看起来好像不是Postgresql对标准sql语法的解释.所以你必须写:

OFFSET (?) ROWS FETCH FirsT (?) ROWS ONLY

I would consider this a bug, which I’ve reported here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐