Диалект Oracle для нумерации страниц

Мы получаем данные из оракула, используя данные Spring JDBC

Мы используем org.springframework.data.relational.core.dialect.OracleDialect для извлечения данных из базы данных.

Он работает должным образом, когда у нас есть репозиторий, использующий CrudRepository

Но если мы изменим репозиторий, который расширяет PagingAndSortingRepository для извлечения на основе номера страницы, мы получим исключение.

На основе анализа мы определили, что запросы, генерируемые LIMIT_CLAUSE и LOCK_CLAUSE, не соответствуют Oracle.

Существует ли диалект Oracle для создания правильного запроса ограничения, который является экземпляром org.springframework.data.relational.core.dialect.Dialect?


person user1862354    schedule 10.04.2021    source источник
comment
какую версию спящего режима и Oracle вы используете?   -  person Adil Khalil    schedule 10.04.2021
comment
Версия Oracle - 12c ... Без спящего режима   -  person user1862354    schedule 11.04.2021


Ответы (1)


Единственные доступные OracleDialect is based on the AnsiDialect` и Oracle12c должны поддерживать стандарт ANSI.

Дальнейшее расследование приводит к подозрению, что стандарт ANSI допускает несколько вариантов и AnsiDialect создает пункт, который не работает с Oracle12, хотя он принимается OracleXE18, который используется для тестирования.

Spring Data JDBC в настоящее время создает предложения формы OFFSET %d ROWS FETCH FIRST %d ROWS ONLY. Что согласно https://dba.stackexchange.com/questions/30452/ansi-iso-plans-for-limit-standardization соответствует стандарту.

Но https://stackoverflow.com/a/24046664/66686 намекает, что Oracle12 может потребоваться OFFSET %d ROWS FETCH NEXT %d ROWS ONLY

В качестве обходного пути вы можете зарегистрировать собственный диалект, как описано в https://spring.io/blog/2020/05/20/migrating-to-spring-data-jdbc-2-0#dialects

person Jens Schauder    schedule 12.04.2021
comment
Спасибо за Вашу информацию. Могу я узнать, как сделать то же самое в Oracle 11g? - person user1862354; 13.04.2021
comment
Синтаксис Oracle11 требует внутреннего выбора. В настоящее время это не поддерживается Spring Data JDBC. - person Jens Schauder; 13.04.2021
comment
Подумываю о следующем варианте на 11г. Вы можете предложить лучший? 1. Создайте хранимую процедуру с внутренним выбором. 2. Используйте в запросе ROWNUM. 3. Можно ли использовать RowMapper? Если да, рассмотрите это также как альтернативу. - person user1862354; 13.04.2021
comment
Я бы предпочел использовать правильный SQL в аннотации @Query и передавать limit и offset в качестве параметров. Возможно добавление метода по умолчанию, вызывающего первый и принимающего Pageable в качестве аргумента. - person Jens Schauder; 13.04.2021