2013-06-09 2 views
2

мне нужно создать динамический оператор обновления будет выполняться с помощью JDBC: исходящий канал-адаптер, потому что мне нужно, чтобы установить одно поле, используя выражение случая, который имеет переменное число условий следующим образом:Как создать динамический запрос для адаптера исходящего канала JDBC Spring Integration?

UPDATE tableA 
SET fieldA = CASE 
        WHEN fieldB IN ('a','b') THEN 1 
        WHEN fieldB IN ('c','d') THEN 2 
        ... 
        WHEN fieldB IN (...) THEN N 
       END 
WHERE fieldC = :headers[MY_FIELDC] 

я могу создать этот динамический оператор обновления в выражении Spring следующим образом:

"'UPDATE tableA SET fieldA = ' + headers[MY_CASE_EXP] + ' WHERE fieldC = :headers[MY_FIELDC]'" 

Но атрибут запроса, кажется, не поддерживает пружину выражение.

Как создать динамический запрос для использования адаптером jdbc: outbound-channel-adapter?

ответ

2

Для того, чтобы создать запрос динамически, вам нужно использовать ExpressionEvaluatingSqlParameterSourceFactory, то, как показано ниже:

<jdbc:outbound-channel-adapter data-source="dataSource" channel="outboundJdbcChannelOne" 
    query="UPDATE tableA SET fieldA = :something WHERE fieldC = :somethingElse" 
    sql-parameter-source-factory="spelSource"/> 

<bean id="spelSource" class="org.springframework.integration.jdbc.ExpressionEvaluatingSqlParameterSourceFactory"> 
    <property name="parameterExpressions"> 
     <map> 
      <entry key="something" value="headers['MY_CASE_EXP']"/> 
      <entry key="somethingElse" value="headers['MY_FIELDC']"/> 
     </map> 
    </property> 
</bean> 

Пожалуйста, смотрите this section весной справочной документации для получения более подробной информации.

+0

Я пробовал этот подход, но не удалось добиться его работы. Он устанавливает fieldA в строку, которая является выражением CASE, а не выполняет выражение CASE. – PeccatorImpius

+0

Что такое value = "# {headers ['MY_CASE_EXP']}"? –

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