Jooq с SQL Server Как выбрать лучшие результаты N - PullRequest
1 голос
/ 11 июня 2019

В нашем проекте мы используем две базы данных, одну postgres и одну mssql. Мы используем Jooq для запросов к этим БД, а с postgres все было довольно просто!

Но с mssql мы сталкиваемся с некоторыми проблемами. Задача состоит в том, чтобы выбрать 10 лучших значений, и предположим, что у нас есть следующий код Java:

DSL.using(conn)
.select(USE_CASE.asterisk())                                                                                                                  
.from(USE_CASE)
.where(USE_CASE.RECORD_ACTIVE.eq(true))                                                                                                                                     
.orderBy(USE_CASE.CREATED_ON.desc())                                                                                                                                     
.limit(10)
.offset(0)                                                                                                                                                                                                
.fetch(new UseCaseMapper()))

Это работает как шарм с postgres, но на mssql мы получаем следующую ошибку:

Execution exception[[CompletionException: org.jooq.exception.DataAccessException: 
SQL [select "park"."dbo"."use_case".* from "park"."dbo"."use_case" where
"park"."dbo"."use_case"."record_active" = ? 
order by "park"."dbo"."use_case"."created_on" desc limit ?]; 
Incorrect syntax near 'limit'.]]

Я знаю, что для mssql эквивалентный запрос будет выглядеть примерно так:

select top 10 * 
from use_case 
where record_active = true
order by created_on desc;

Как я могу изменить свой код Java, чтобы получить записи о лимитах в mssql?

1 Ответ

0 голосов
/ 11 июня 2019

Правильно SQLDialect

Сообщение об исключении намекает на тот факт, что вы все еще используете диалект PostgreSQL (или некоторый другой не-SQL Server), поскольку ваши каталоги / схемы / таблицы / столбцы цитируются с использованием"double_quotes" вместо [brackets].

Просто используйте SQLDialect.SQLSERVER вместо этого при выполнении запроса на SQL Server.Синтаксис LIMIT 10 будет затем правильно переведен в TOP 10.

jOOQ Professional Edition против jOOQ Open Source Edition

Из наших опубликованных сообщений об ошибках не совсем понятно, как вы действительно настроиливаша интеграция с jOOQ, но если вы используете DSL.using(Connection) без явного указания SQLDialect, и jOOQ не может правильно «угадать» соответствующий SQLDialect, это может быть в основном из-за одного издве причины:

  1. Вы используете какой-то нестандартный URL JDBC, который jOOQ не распознает.Таким образом, вместо этого используется SQLDialect.DEFAULT, что создает неправильный синтаксис SQL для вашего.
  2. Вы используете jOOQ Open Source Edition (Maven groupId org.jooq) вместо jOOQ Professional Edition (Maven groupId org.jooq.pro, устанавливается вручную, поскольку он не распространяется через Maven Central), что также приведет к jOOQ с использованием SQLDialect.DEFAULT.

    Примечание: это также может произойти случайно , например, как транзитивная зависимость, которая извлекается через Spring Boot или какую-либо другую среду, которая уже зависит от jOOQ Open Source Edition.В этом случае вы должны убедиться, что эта транзитивная зависимость не попадает в ваш путь к классам.В Maven вы можете отобразить все свои зависимости, используя mvn dependency:tree

...