我正在使用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?
答案 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的首选方式。它将在服务器端编译(索引,查询计划等),并重新用于所有其他即将执行的执行。