java - JOOQ 如何做 UNION 和 WHERE IN

标签 java mysql sql jooq

我正在使用 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()方法返回带有绑定(bind)变量 (?) 的查询。然后将该 SQL 字符串传递给 PreparedStatement 并单独绑定(bind)变量,首先通过 Query.getBindValue() 提取它们

Query.getSQL(boolean) 的替代版本或 Query.getSQL(ParamType)方法将向 jOOQ 指示绑定(bind)变量应该内联到 SQL 字符串中,以形成静态 SQL 语句,而不是准备好的语句。

您还可以通过在您提供 jOOQ ConfigurationSettings 上使用 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/

相关文章:

Java实现htonl

c# - MySql 使用旧密码进行身份验证时出错

java - 如何在Python中使正在运行的jar程序超时

java - 关于@String 上的加法

mysql - 使用 join 和 max 更新行

mysql - 将mysql用户迁移到另一台服务器

sql - 如何重构此 SQL 查询?

使用变量的 Java Derby SQL 查询语句

c# - OLEDB 读取 CSV 文件仅返回第一列

java - 插入数据,如果已经插入,则在 sql 中更新