当前位置: 首页 > 知识库问答 >
问题:

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

芮岳
2023-03-14

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

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

查询SELECT_SQL

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

查询。结束_分页_语句_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仅获取前M行,它将通过JDBC正常工作。最简单的解决方案是进行上述简单的更改,但我的部分任务是使用FETCH FIRST M ROWS ONLY语句进行查询。

那么,你们能帮我看看我是否做错了,或者是否根本没有办法在JDBC上为PostgreSQL使用FETCH FIRST吗?通过一些例子或对任何留档的引用来帮助。

我注意到PostgreSQL文档中没有FETCH FIRST:querys-Offset和Limit,但由于它通过pgAdmin工作,我不知道为什么我在使用JDBC时会遇到任何问题。

非常感谢你!

共有1个答案

阎弘雅
2023-03-14

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

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

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

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

我认为这是一个bug,我在这里报道过。

 类似资料:
  • 我看到多伦多在UTC-4上。 但我怎么才能得到真正的偏移呢?

  • 为什么实际主题中的偏移值与同一主题中的偏移值不同?PFB偏移位置以及使用的命令。 我错过了什么?

  • 问题内容: 在SQL Server中,我需要找到给定的偏移量。 我已经研究了文档,并且有各种方法可以更改偏移量,但是没有一种方法可以了解特定值的偏移量(很抱歉,如果我错过了它)。 好吧,我想出了以下代码,尽管看起来似乎可行,但我觉得它太复杂了。 我仍然必须转换为+00:00格式,但想检查是否有更好的方法。 谢谢! 问题答案: datepart函数具有tz选项,它是时区偏移量(以分钟为单位)。

  • 问题内容: 我有一张表,其中有一列,有330万个条目。我想遍历表,每200个条目执行一次操作。我有以下代码: 最初,此方法运行良好(生成tmp表的时间约为0.15秒),但偶尔会变慢,例如,大约有30万张票,它开始花费11-12秒的时间来生成此tmp表,然后大约有40万张。基本上看来是不可靠的。 我将在其他查询中使用这些ID,因此我认为在tmp表中放置ID的最佳位置。有没有更好的方法来遍历这样的结果

  • 我有一个UTC的时间戳。我将其转换为本地时间。我的时区是CET/CEST。 由于我的时区,系统会自动应用正确的偏移量:如果我在夏天转换时间戳,它会自动添加2小时(无论何时转换),如果在冬天,它会添加1小时。 到目前为止-很好。 现在,我想基于另一个引用的时间戳转换UTC时间戳。如果引用在夏季,则应始终添加2小时-无论转换的时间戳是夏季还是冬季-如果引用在冬季,则应始终添加1小时。 那么,如果我的系