【发布时间】:2018-05-16 13:04:33
【问题描述】:
我正在尝试使用 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 ROWS FETCH FIRST M ROWS ONLY 更改为OFFSET N LIMIT M,它将通过JDBC 正常工作。
最简单的解决方案是在上面进行简单的更改,但我的部分任务是使用此 FETCH FIRST M ROWS ONLY 语句进行查询。
那么,你们能帮我看看我是否做错了,或者根本没有办法在 JDBC for PostgreSQL 上使用FETCH FIRST?提供一些示例或对任何有帮助的文档的一些参考。
我注意到FETCH FIRST 在PostgreSQL Documentation: Queries - Offset and Limit 上不存在,但由于它通过 pgAdmin 工作,我不知道为什么我在使用 JDBC 时会遇到任何问题。
非常感谢!
【问题讨论】:
-
fetch first是关于selectstatement 的章节中的文档 - 看起来像文档错误 -
您也不能在
PreparedStatement中提供限制/偏移作为可分配参数。实际上,这可能不再适用,取决于驱动程序。 -
谢谢@a_horse_with_no_name,它被隐藏在索引中,但看起来我对查询没有做错任何事情。
-
@Kayaman,但是如果我将
OFFSET N ROWS FETCH FIRST M ROWS ONLY更改为OFFSET N LIMIT M它将正常工作,而无需更改PreparedStatement上的任何内容,为什么会有所不同? -
看来
PreparedStatement确实允许参数化限制/偏移,但我可以发誓我之前遇到过问题。我可能正在考虑一些不允许这样做的混淆层。
标签: java sql postgresql jdbc