我使用org.jooq.impl.Executor
创建了一个我想传递给JdbcOperations
的查询。我使用.where(Condition...)
传递参数值。
在为执行程序链接方法之后,我得到一个Query
对象。问题是当我调用query.getSQL()
时,返回的查询字符串包含参数?,?,?
而不是我插入的值。
这是我用来构建SQL查询的代码。
请注意,TableA
有三个TableB
的外键。我尝试使用JOIN ON
与OR
加入TableA
和TableB
,但效果太慢了。
Query query = executor.select(fieldsToSelect)
.from("TableA")
.join("TableB").on("TableA.FirstForeignKey = TableB.TableBID")
.join("TableC")
.on("TableC.TableCID = TableB.TableCForeignKey")
.where(condition)
.union(executor.select(fieldsToSelect)
.from("TableA")
.join("TableB").on("TableA.SecondForeignKey = TableB.TableBID")
.join("TableC")
.on("TableC.TableCID = TableB.TableCForeignKey")
.where(condition)
.union(executor.select(fieldsToSelect)
.from("TableA")
.join("TableB").on("TableA.ThirdForeignKey = TableB.TableBID")
.join("TableC")
.on("TableC.TableCID = TableB.TableCForeignKey")
.where(condition)));
这是我为执行者创建Condition
对象的方法:
MySQLFactory.fieldByName(Integer.class, TABLE_NAME_TABLEA, "TableAID")
.in(ArrayUtils.toObject(ids));
这是我执行查询的方式:
jdbcOperations.query(query.getSQL(),query.getBindValues().toArray(), myMapper);
如何使用值正确映射参数并将查询与JdbcOperations
一起使用?
答案 0 :(得分:1)
默认情况下,Query.getSQL()
方法返回带有绑定变量(?
)的查询。然后,您将该SQL字符串传递给PreparedStatement
并单独绑定变量,首先通过Query.getBindValue()
Query.getSQL(boolean)
或Query.getSQL(ParamType)
方法的替代版本将向jOOQ指示绑定变量应该内联到SQL字符串中,以便形成静态SQL语句,而不是预准备语句。
您还可以告诉jOOQ使用您提供jOOQ StatementType.STATIC_STATEMENT
的{{1}}上的Settings
将所有SQL语句生成为静态语句。
这里都记录了这些:
http://www.jooq.org/doc/latest/manual/sql-building/bind-values/inlined-parameters/