Если я сохраню промежуточный результат из построителя запросов Fluent 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 из запросов либо в журналы аудита, либо в журналы отладки. Могу ли я безопасно вызывать getSQL()
до или после вызова fetch*()
методов?
Начиная с jOOQ 3.16, да, эти конкретные методы предоставляют изменяемое поведение, поэтому вы можете динамически создавать запрос, как вы это делали. См. также Раздел руководства jOOQ об изменчивости, который намекает на то, что это может измениться в (далеком) будущем в пользу более предсказуемых неизменяемых API-интерфейсов DSL.
Но даже если это можно использовать, вы не должны создавать динамические SQL-запросы таким образом. Используйте рекомендуемый подход:
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
был изменен, см. раздел об изменчивости.
my main desire is to sometimes log the SQL from queries either to audit logs or debugging logs
Вы можете либо использовать встроенное ведение журнала выполнения, который записывает все запросы на уровень DEBUG
.
Can I safely call
getSQL()
before or after callingfetch*()
methods?
Да, эти звонки безопасны. Это то, что делает вышеприведенное ведение журнала выполнения, чтобы применить форматирование, встраивание значений привязки для целей ведения журнала и т. д.