gpt4 book ai didi

java - jooq 返回具有错误值的查询

转载 作者:行者123 更新时间:2023-11-30 04:53:22 25 4
gpt4 key购买 nike

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

最佳答案

org.jooq.Query.getSQL()呈现 SQL 的方式与呈现给 JDBC 的方式完全相同 PreparedStatement 。 Java 中的准备语句期望绑定(bind)变量呈现为问号:?。然后使用方法设置实际的绑定(bind)值,如本例所示

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

如果您想查看生成的带有内联绑定(bind)值的 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))
);

Query 对象上还有一个 getSQL(boolean) 方法,用于使用内联绑定(bind)变量呈现 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

关于java - jooq 返回具有错误值的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9366772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com