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))
);

对象上还有一个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

于 2012-02-20T21:45:07.500 回答