JOOQ如何在

时间:2015-12-02 13:13:27

标签: 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一起使用?

1 个答案:

答案 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/