JOOQ 如何做 UNION 和 WHERE IN
JOOQ How to do UNION and WHERE IN
我正在使用 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()
method returns a query with bind variables (?
). You'll then pass that SQL string to a PreparedStatement
and bind the variables individually, extracting them first via Query.getBindValue()
Query.getSQL(boolean)
or Query.getSQL(ParamType)
方法的替代版本将向 jOOQ 指示绑定变量应内联到 SQL 字符串中,以形成静态 SQL 语句,而不是准备好的声明。
您还可以通过在您提供给 jOOQ Configuration
的 Settings
上使用 StatementType.STATIC_STATEMENT
告诉 jOOQ 将所有 SQL 语句生成为静态语句。
这里记录了所有内容:
http://www.jooq.org/doc/latest/manual/sql-building/bind-values/inlined-parameters/
我正在使用 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()
method returns a query with bind variables (?
). You'll then pass that SQL string to a PreparedStatement
and bind the variables individually, extracting them first via Query.getBindValue()
Query.getSQL(boolean)
or Query.getSQL(ParamType)
方法的替代版本将向 jOOQ 指示绑定变量应内联到 SQL 字符串中,以形成静态 SQL 语句,而不是准备好的声明。
您还可以通过在您提供给 jOOQ Configuration
的 Settings
上使用 StatementType.STATIC_STATEMENT
告诉 jOOQ 将所有 SQL 语句生成为静态语句。
这里记录了所有内容:
http://www.jooq.org/doc/latest/manual/sql-building/bind-values/inlined-parameters/