我可以根据收到的消息为int-jdbc:outbound-channel-adapter定义目标表吗?

时间:2015-03-16 13:59:12

标签: spring jdbc spring-integration

我正在使用Spring Integration JDBC支持在一个表(> 20)中保留一条消息,具体取决于某个条件(存储在消息头中的“table”):

<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 个答案:

答案 0 :(得分:1)

不,它现在不起作用,TABLE_NAME不能作为参数。

随意提出JIRA问题,考虑像query-expression那样在运行时根据请求消息构建INSERT/UPDATE SQL。

与此同时,您应该使用NamedParameterJdbcTemplate中某些自定义POJO中的<outbound-channel-adapter>或者像复杂表达式一样使用{/ p>}:

<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的{​​{1}}变体是任何RDBMS的首选方式。它将在服务器端编译(索引,查询计划等),并重新用于所有其他即将执行的执行。