我正在尝试使用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] 举报,一经查实,本站将立刻删除。