2015-03-16 2 views
1

I'm с помощью поддержки Spring Integration JDBC упорствовать сообщение в одном из нескольких таблиц (> 20) в зависимости от определенного состояния (хранится в заголовках сообщений, как «стол»):Могу ли я определить целевую таблицу для int-jdbc: исходящего канала-адаптера на основе полученного сообщения?

<int:channel id="cmTablesJdbcChannel"></int:channel> 
<int-jdbc:outbound-channel-adapter channel="cmTablesJdbcChannel" 
    id="cmTableJdbcOutputAdaptor" data-source="datasource" 
    query="insert into TABLE_NAME values (int_id, parent_int_id, name) values (:headers[int_id],:headers[parent_int_id],:headers[name])"> 
</int-jdbc:outbound-channel-adapter> 

Я попытался заменить TABLE_NAME несколькими выражениями, но никто не работал:

${headers['table']} 
#{headers['table']} 
:[headers['table]} 

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

Были подобные вопросы, но связаны с параметрами, которые будут использоваться: How can I create a dynamic query for Spring Integration JDBC outbound-channel-adapter?

ответ

1

Нет, она сейчас не работает и TABLE_NAME не может быть в качестве параметра.

Не стесняйтесь поднять JIRA вопрос, чтобы рассмотреть что-то вроде query-expression, чтобы построить INSERT/UPDATE SQL во время выполнения запроса сообщения.

В то же время вы должны использовать NamedParameterJdbcTemplate от некоторых пользовательских POJO для использования с <outbound-channel-adapter> или как сложное выражение:

<service-activator input-channel="cmTablesJdbcChannel" output-channel="nullChannel" 
    expression="@jdbcTemplate.update('insert into ' + headers.table + ' (int_id, parent_int_id, name) values (:int_id,:parent_int_id,:name)', headers)"/> 

Примечание, не используйте прямое выражение SQL здание со значениями параметров. Вариант parametrized с : является предпочтительным способом для любой СУБД. Он будет скомпилирован на стороне сервера (индексы, план запросов и т. Д.) И повторно использован для всех других предстоящих исполнений.

+0

Это отличный способ сделать это! Я боялся, что мне пришлось выполнить всю реализацию в классе ServiceActivator ... Я попробую. Благодаря! – Victor

Смежные вопросы