Как загрузить bean-компонент, только если свойство имеет значение false или не определено?

Предполагаю, вы имеете в виду, что вы хотите получить окончательный SQL-запрос с параметрическими значениями, интерполированными в него. Я понимаю, что это было бы полезно для отладки, но это не так, как работают подготовленные заявления. Параметры не объединены с подготовленным оператором на стороне клиента, поэтому PDO никогда не должен иметь доступ к строке запроса в сочетании со своими параметрами.

Оператор SQL отправляется на сервер базы данных при подготовке ( ), и параметры отправляются отдельно, когда вы выполняете (). Общий журнал запросов MySQL показывает окончательный SQL со значениями, интерполированными после выполнения (). Ниже приведен фрагмент моего основного журнала запросов. Я запускал запросы из CLI mysql, а не из PDO, но принцип тот же.

081016 16:51:28 2 Query       prepare s1 from 'select * from foo where i = ?'
                2 Prepare     [2] select * from foo where i = ?
081016 16:51:39 2 Query       set @a =1
081016 16:51:47 2 Query       execute s1 using @a
                2 Execute     [2] select * from foo where i = 1

Вы также можете получить то, что хотите, если вы установите атрибут PDO PDO :: ATTR_EMULATE_PREPARES. В этом режиме PDO интерполирует параметры в SQL-запрос и отправляет весь запрос при выполнении (). Это не настоящий подготовленный запрос. Вы обойдете преимущества подготовленных запросов путем интерполяции переменных в строку SQL перед execute ().


Re comment from @afilina:

Нет, текстовый SQL-запрос не в сочетании с параметрами во время выполнения. Таким образом, PDO не показывает вам.

Внутренне, если вы используете PDO :: ATTR_EMULATE_PREPARES, PDO создает копию SQL-запроса и интерполирует значения параметров в него перед выполнением подготовки и выполнения. Но PDO не предоставляет этот модифицированный SQL-запрос.

Объект PDOStatement имеет свойство $ queryString, но это устанавливается только в конструкторе для PDOStatement, и оно не обновляется, когда запрос переписывается с параметрами.

Это будет разумный запрос функции для PDO, чтобы попросить их разоблачить перезаписанный запрос. Но даже это не даст вам «полный» запрос, если вы не используете PDO :: ATTR_EMULATE_PREPARES.

Вот почему я показываю обходное решение выше, используя общий журнал запросов MySQL, поскольку в этом случае даже готовый запрос с записями параметров перезаписывается на сервере, а значения параметров возвращаются в строку запроса. Но это делается только во время ведения журнала, а не во время выполнения запроса.

0
задан Ortomala Lokni 24 February 2019 в 17:35
поделиться

1 ответ

Решение состоит в том, чтобы использовать аннотацию @ConditionalOnExpression со значением по умолчанию в заполнителе свойства:

@ConditionalOnExpression("'${dlcm.module.auth.enable:false}' == 'false'")
0
ответ дан Ortomala Lokni 24 February 2019 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: