在 JOOQ 中,我如何结合 Query#getSQL() 和 Query#getBindValues() 来进行“JOOQless”查询?

问题描述 投票:0回答:0

Jooq 文档解释了如何将其用作查询生成器:https://www.jooq.org/doc/latest/manual/getting-started/use-cases/jooq-as-a-sql-builder-without-代码生成/

但我想更进一步:是否可以使用 jooq 生成查询而不进一步依赖 jooq?我会解释。

我将重用 jooq 文档给出的示例:

// Fetch a SQL string from a jOOQ Query in order to manually execute it with another tool.
// For simplicity reasons, we're using the API to construct case-insensitive object references, here.
Query query = create.select(field("BOOK.TITLE"), field("AUTHOR.FIRST_NAME"), field("AUTHOR.LAST_NAME"))
                    .from(table("BOOK"))
                    .join(table("AUTHOR"))
                    .on(field("BOOK.AUTHOR_ID").eq(field("AUTHOR.ID")))
                    .where(field("BOOK.PUBLISHED_IN").eq(1948));
String sql = query.getSQL();
List<Object> bindValues = query.getBindValues();

在这个例子中,我们可以使用 sql 和 bindValues 来创建一个

PreparedStatement
,但是如果我们想查询另一个“BOOK.PUBLISHED_IN”年份,我们需要:

  1. 再次将所需的年份传递给 jooq 查询构建器。
  2. 提前知道,当呈现查询时,“BOOK.PUBLISHED_IN” 参数是绑定参数“1”,并按顺序将其传递给
    PreparedStatement

我不想选择选项 1,因为在生成查询后我不会使用 jooq 作为依赖项,而选项 2 的问题是,如果没有 jooq,我将需要“假设”并可能手动审查呈现 SQL 并调整查询参数顺序。

我尝试使用

Query#getParams()
,但返回类型是
Map
,这对于“排序”不可靠,它还包含由
Param
生成的
DSL.inline
对象,我不需要这些对象,因为它们已经在查询。

我正在寻找解决方案,以便在生成查询后不依赖 jooq 来了解绑定顺序。按照上面的例子,我们可以有一个名为

year
的命名参数,并“询问”jooq 属性的位置,在这种情况下它将是 1,但是如果同一个命名参数在查询中出现多次,它可以返回许多职位。

java jooq
© www.soinside.com 2019 - 2024. All rights reserved.