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 ONOR 来连接 TableATableB 但是性能太慢了。

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 ConfigurationSettings 上使用 StatementType.STATIC_STATEMENT 告诉 jOOQ 将所有 SQL 语句生成为静态语句。

这里记录了所有内容:

http://www.jooq.org/doc/latest/manual/sql-building/bind-values/inlined-parameters/