1

次の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() に手動で文字列値を挿入しても、疑問符が返されます。

4

1 に答える 1

2

org.jooq.Query.getSQL()JDBC にレンダリングされるのとまったく同じように SQL をレンダリングします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))
);

オブジェクトには、インライン化されたバインド変数を使用して SQL をレンダリングするgetSQL(boolean)メソッドもあります。Query

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

于 2012-02-20T21:45:07.500 に答える