jooq проблема с лимитом и смещением

Я интегрировал jooq с spring и для всех типов запросов к базе данных (MySQL) я использую шаблон JDBC Spring. Библиотека jooq используется здесь для генерации запроса sql для перехода к шаблону jdbc.

Хотя остальная часть моего запроса работает нормально, пока я не добавлю ограничение и/или смещение к запросу.

Я генерирую запрос следующим образом:

create.select(Factory.field("table_name"))
      .from("tables t")
      .where("t.table_schema LIKE '" + schemaName + "'")
      .limit(10)
      .offset(2)
      .getSQL();

Я получаю ошибку следующим образом:

org.springframework.jdbc.BadSqlGrammarException: StatementCallback; неверная грамматика SQL [выберите table_name из таблиц t где (t.table_schema LIKE 'test') limit ? компенсировать ?]; вложенным исключением является com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с '? компенсировать ?' в строке 1

Что ясно говорит о том, что значения, переданные в метод limit и offset, не добавляются к запросу.

Я искал документацию, но не нашел другого способа добиться этого.


person Rahul Shelke    schedule 04.12.2012    source источник


Ответы (1)


jOOQ генерирует SQL со значениями привязки. Поскольку вы используете jOOQ только для рендеринга SQL, выполняя его с помощью Spring, у вас по существу есть любой из этих вариантов:

Используйте встроенные значения привязки явно:

Таким образом, вы можете явно указать jOOQ не отображать какие-либо переменные связывания для вашего предложения LIMIT .. OFFSET.

create.select(DSL.field("table_name"))
      .from("tables t")
      .where("t.table_schema LIKE '" + schemaName + "'")
      .limit(DSL.inline(10))
      .offset(DSL.inline(2))
      .getSQL();

Пусть jOOQ встраивает все значения привязки:

Таким образом, вы можете указать jOOQ вообще не отображать никакие переменные связывания:

Settings settings = new Settings();
settings.setStatementType(StatementType.STATIC_STATEMENT);
DSLContext create = DSL.using(connection, dialect, settings);
// [...]

Извлеките значения привязки из запроса jOOQ:

Таким образом, вы можете позволить jOOQ отображать переменные связывания, где это необходимо, и извлекать их в правильном порядке:

Query query =
create.select(DSL.field("table_name"))
      .from("tables t")
      .where("t.table_schema LIKE '" + schemaName + "'")
      .limit(DSL.inline(10))
      .offset(DSL.inline(2));

String sql = query.getSQL();
List<Object> bindValues = query.getBindValues();

Дополнительная информация о понимании jOOQ значений привязки:

http://www.jooq.org/doc/latest/manual/sql-building/bind-values/

Примечание о целостности синтаксиса и внедрении SQL

Помните, что ваш запрос несколько подвержен ошибкам, поскольку schemaName следует проверять и экранировать, если он исходит от пользовательского ввода. Вы можете создать для него значение привязки как таковое:

create.select(DSL.field("table_name"))
      .from("tables t")
      .where("t.table_schema LIKE ?", schemaName)
person Lukas Eder    schedule 04.12.2012
comment
Спасибо, Лукас ... Это решило мою проблему ... И вы правы насчет значения привязки ... Я всегда буду помнить об этом ... хотя в настоящее время в этом сценарии это не влияет, так как 'schemaName' исходит из единый список выбора. - person Rahul Shelke; 05.12.2012