jooq返回不正确的值的查询

时间:2012-02-20 18:55:17

标签: java insert jooq

我想使用以下基于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()中手动插入String值,getSQL()也会返回问号。

1 个答案:

答案 0 :(得分:1)

org.jooq.Query.getSQL()呈现的SQL与呈现给JDBC PreparedStatement的SQL完全相同。 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