OFFSET N FETCH FIRST M ROWS с JDBC и PostgreSQL не работает - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь сделать запрос, используя 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.

Итак, вы, ребята, можете помочь мне узнать, правильно ли я это делаю, или нет никакого способа использовать FETCH FIRST на JDBC для PostgreSQL вообще? С некоторыми примерами или ссылками на любую документацию, которая может помочь.

Я заметил, что FETCH FIRST не существует в Документация PostgreSQL: Запросы - смещение и ограничение , но, поскольку он работает через pgAdmin, я не знаю, почему у меня должны возникнуть какие-либо проблемы с использованием JDBC.

Спасибо большое!

1 Ответ

0 голосов
/ 16 мая 2018

Я могу воспроизвести эту проблему.Начиная с версии 10 документация гласит:

В этом синтаксисе для записи чего-либо, кроме простой целочисленной константы для start или count, вы должны заключить в скобки

Что смешно, конечно.Переменные связывания должны быть разрешены без скобок - большинство баз данных допускают их, а синтаксис OFFSET ? LIMIT ? также принят PostgreSQL, но похоже, что они не соответствуют интерпретации PostgreSQL стандартного синтаксиса SQL.Поэтому вам нужно будет написать:

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

Я бы посчитал это ошибкой, о которой я сообщил здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...