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”年份,我们需要:
PreparedStatement
。我不想选择选项 1,因为在生成查询后我不会使用 jooq 作为依赖项,而选项 2 的问题是,如果没有 jooq,我将需要“假设”并可能手动审查呈现 SQL 并调整查询参数顺序。
我尝试使用
Query#getParams()
,但返回类型是 Map
,这对于“排序”不可靠,它还包含由 Param
生成的 DSL.inline
对象,我不需要这些对象,因为它们已经在查询。
我正在寻找解决方案,以便在生成查询后不依赖 jooq 来了解绑定顺序。按照上面的例子,我们可以有一个名为
year
的命名参数,并“询问”jooq 属性的位置,在这种情况下它将是 1,但是如果同一个命名参数在查询中出现多次,它可以返回许多职位。