Обновление последнего извлеченного идентификатора из запроса на выборку при использовании адаптера входящего канала JDBC в интеграции с Spring - PullRequest
0 голосов
/ 20 июня 2019

Я использую адаптер JDBC Ibound channel - пытаюсь обновить столбец в таблице, значение которого будет значением столбца последней записи, выбранной в запросе выбора.

Попытка с использованием полезной нагрузки [ключ] и: column_value_of_lastselectedrecord

`<int-jdbc:inbound-channel-adapter id="pollTradeDataChannelAdapter"
        channel="pollTradeDataChannel" data-source="datasource" 
        query="select id, name from employee"
        update="update cache set id = :payload[id]">
        <int:poller id="pollTradeDataChannelAdapterPoller" error-channel="pollTradeServiceErrorChannel" 
            fixed-delay="5000">
            <int:transactional transaction-manager="transactionmanager" />
        </int:poller>
    </int-jdbc:inbound-channel-adapter>`

При попытке запустить мое приложение, используя вышеуказанную конфигурацию интеграции с пружиной, выдается исключение SQL состояние SQL [ноль];код ошибки [17004];Неверный тип столбца.Помогите, пожалуйста, узнать, как обновлять данные в ответ на заданный запрос.

1 Ответ

0 голосов
/ 20 июня 2019

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

вам нужно ввести через update-sql-parameter-source-factory атрибут настроенный ExpressionEvaluatingSqlParameterSourceFactory с настроенным setParameterExpressions.Я думаю, что такое выражение SpEL должно работать для вас:

sqlParameterSourceFactory.setParameterExpressions(Collections.singletonMap("lastId", "#root.$[true].id"))

Тогда запрос update должен быть таким: update="update cache set id = :lastId".

Нет контекста payload дляобновить запрос в <int-jdbc:inbound-channel-adapter>.

ОБНОВЛЕНИЕ

ОК.Я провел некоторую отладку и понял, что ExpressionEvaluatingSqlParameterSourceFactory не соответствует вашим требованиям.Когда input является Collection, предоставленное выражение переносится на другое, и мы никак не можем повлиять на его результат.

Для вашего last item selection варианта использования я придумал что-то вродеthis:

public class MySqlParameterSourceFactory implements SqlParameterSourceFactory {

    @Override
    public SqlParameterSource createParameterSource(Object input) {
        return new MySqlParameterSource(input);
    }

    private static class MySqlParameterSource implements SqlParameterSource {

        private final Map<String, Object> lastResult;

        public MySqlParameterSource(Object input) {
            this.lastResult = ((List<Map<String, Object>>) input).stream()
                    .reduce((first, second) -> second)
                    .orElse(null);

        }

        @Override
        public boolean hasValue(String paramName) {
            return lastResult.containsKey(paramName);
        }

        @Override
        public Object getValue(String paramName) throws IllegalArgumentException {
            return lastResult.get(paramName);
        }

    }

}

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

Конфигурация адаптера канала будет такой:

<int-jdbc:inbound-channel-adapter id="pollTradeDataChannelAdapter"
    channel="pollTradeDataChannel" data-source="datasource" 
    query="select id, name from employee"
    update-sql-parameter-source-factory="sqlParameterSourceFactory"
    update="update cache set id = :id">
    <int:poller id="pollTradeDataChannelAdapterPoller" error-channel="pollTradeServiceErrorChannel" 
        fixed-delay="5000">
        <int:transactional transaction-manager="transactionmanager" />
    </int:poller>
</int-jdbc:inbound-channel-adapter>

<beans:bean id="sqlParameterSourceFactory"
            class="my.com.my.project.MySqlParameterSourceFactory"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...