jOOQ fluent API 中间结果是不可变的吗?

Are the jOOQ fluent API intermediate results immutable?

如果我保存来自流畅 API 查询生成器的中间结果,以后调用会修改它吗? (换句话说,中间结果是不可变的吗?)例如,

final var a = create.select().from(AUTHOR);
final var before1920 = a.where(AUTHOR.YEAR_OF_BIRTH.gt(1920).fetch();
final var authorSql = a.where(AUTHOR.FIRST_NAME.eq("Paulo")).getSql();

我可以确信 a 没有被后面的语句修改吗?

如果不是这种情况,我的主要愿望是有时将查询中的 SQL 记录到审计日志或调试日志中。我可以在调用 fetch*() 方法之前或之后安全地调用 getSQL() 吗?

jOOQ DSL 的可变性

从 jOOQ 3.16 开始,是的,那些特定方法公开了可变行为,因此您可以像以前那样动态构造查询。另见 jOOQ manual's section about mutability,它暗示这可能在(遥远的)未来发生变化,支持更可预测的不可变 DSL API。

但是即使这可以被利用,你也不应该像这样构造dynamic SQL queries。使用推荐的方法:

Condition condition = AUTHOR.YEAR_OF_BIRTH.gt(1920);

if (...)
    condition = condition.and(AUTHOR.FIRST_NAME.eq("Paulo"));

create.select()
      .from(AUTHOR)
      .where(condition)
      .fetch();

这对您的实际问题没有帮助,但它回答了您提出的部分问题,即您不应该依赖这种可变行为。

具体问题

Can I be confident that a was not modified by the later statements?

不,你不能。 a 已修改,请参阅 the section about mutability

my main desire is to sometimes log the SQL from queries either to audit logs or debugging logs

您可以 use the built in execute logging,它将所有查询记录到 DEBUG 级别。

Can I safely call getSQL() before or after calling fetch*() methods?

是的,那些电话是安全的。这也是上面的执行日志记录所做的,为了应用格式、内联绑定值以进行日志记录等。