Jooq вернуть запрос с неправильными значениями - PullRequest
1 голос
/ 20 февраля 2012

Я хочу вставить данные таблицы базы данных, используя следующий код на основе jooq для генерации запроса:

Factory jf = getJooqFactory();
int surveyId = jf.nextval(SURVEY_ID_SEQ).intValue();
jf.insertInto(SURVEY)
        .set(SURVEY.ID, surveyId)
        .set(SURVEY.NAME, survey.getName())
        .set(SURVEY.IDML, Factory.val(idml, SQLDataType.CLOB))
        .execute();

Проблема заключается в том, что когда я печатаю запрос с использованием этого кода

System.out.println(jf.insertInto(SURVEY)
            .set(SURVEY.ID, null)
            .set(SURVEY.NAME, null)
            .set(SURVEY.IDML, null)
            .getSQL());

я получаю запрос с вопросительными знаками вместо значений.

insert into "collect"."survey" ("id", "name", "idml") values (?, ?, ?)

Когда я печатаю значения переменных по отдельности, все они верны.Даже если я вставлю строковые значения вручную в .set (), getSQL () вернет вопросительные знаки.

1 Ответ

2 голосов
/ 21 февраля 2012

org.jooq.Query.getSQL() отображает SQL в точности так, как он отображается в JDBC PreparedStatement. Подготовленные операторы в Java предполагают, что переменные связывания будут отображаться в виде вопросительных знаков: ?. Фактические значения привязки затем устанавливаются с помощью методов, таких как в этом примере

PreparedStatement stmt = connection.prepareStatement(
  "insert into collect.survey (id, name, idml) values (?, ?, ?)");
stmt.setInt(1, surveyId);
stmt.setString(2, survey.getName());
stmt.setString(3, idml);
stmt.executeUpdate();

Если вы хотите увидеть сгенерированный SQL со встроенными значениями связывания, вы можете использовать метод фабрики Factory.renderInlined():

String sql = jf.renderInlined(
  jf.insertInto(SURVEY)
    .set(SURVEY.ID, surveyId)
    .set(SURVEY.NAME, survey.getName())
    .set(SURVEY.IDML, val(idml, SQLDataType.CLOB))
);

Существует также метод getSQL(boolean) для объекта Query для визуализации SQL с помощью встроенных переменных связывания:

jf.insertInto(SURVEY)
  .set(SURVEY.ID, surveyId)
  .set(SURVEY.NAME, survey.getName())
  .set(SURVEY.IDML, val(idml, SQLDataType.CLOB))
  .getSQL(true);

Узнайте больше о JDBC PreparedStatement здесь:

http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html

...