我正在使用 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
进行查询?
最佳答案
默认情况下,Query.getSQL()
方法返回带有绑定(bind)变量 (?
) 的查询。然后将该 SQL 字符串传递给 PreparedStatement
并单独绑定(bind)变量,首先通过 Query.getBindValue()
提取它们
Query.getSQL(boolean)
的替代版本或 Query.getSQL(ParamType)
方法将向 jOOQ 指示绑定(bind)变量应该内联到 SQL 字符串中,以形成静态 SQL 语句,而不是准备好的语句。
您还可以通过在您提供 jOOQ Configuration
的 Settings
上使用 StatementType.STATIC_STATEMENT
告诉 jOOQ 将所有 SQL 语句生成为静态语句> 与。
这一切都记录在这里:
http://www.jooq.org/doc/latest/manual/sql-building/bind-values/inlined-parameters/
关于java - JOOQ 如何做 UNION 和 WHERE IN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34043667/