Являются ли промежуточные результаты jOOQ fluent API неизменными?

Если я сохраню промежуточный результат из построителя запросов 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*() методов?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
17
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Изменяемость jOOQ DSL

Начиная с 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 calling fetch*() methods?

Да, эти звонки безопасны. Это то, что делает вышеприведенное ведение журнала выполнения, чтобы применить форматирование, встраивание значений привязки для целей ведения журнала и т. д.

Другие вопросы по теме