Чтобы получить , обновите столбец в таблице, значением которого будет значение столбца последней выбранной записи , для этого параметра должно быть настроено пользовательское выражение.
вам нужно ввести через 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"/>