我想使用以下基于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()也会返回问号。
答案 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