Mule ESB, оператор IN в преобразователе JDBC

Давайте представим, что я хотел бы передать список в преобразователь JDBC.

Например, я создаю список в потоке:

<scripting:transformer><scripting:script engine="groovy"><scripting:text>
    // Some calculations and stuff

    def single_quote_alias = "'"
    def listString = seasonMbIds.join("',' ")           
    return single_quote_alias + listString + single_quote_alias // now it's like:  '11','22','33' 
</scripting:text></scripting:script></scripting:transformer>

А затем передайте список в другой преобразователь:

<jdbc:outbound-endpoint connector-ref="XYZ" queryKey="someName" exchange-pattern="request-response" />

и вот собственно запрос:

<jdbc:query key="someName" 
                value="SELECT anID FROM aTable WHERE aField IN (#[payload:])" />

это дает мне «исключение вне связанного индекса»:

Message               : java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 (javax.script.ScriptException)
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. Index: 0, Size: 0 (java.lang.IndexOutOfBoundsException)
  java.util.ArrayList:635 (null)
2. java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 (javax.script.ScriptException)

Возможно, есть некоторые проблемы с бегством. Я использовал разные разделители, и проблема все еще существует...

Любое предложение ?


person Vahid Rafiei    schedule 28.02.2014    source источник
comment
Какую версию вы используете BTW? Я вижу #[payload:], так что я думаю 3.2 или старше? Иначе это было бы #[message.payload]...   -  person David Dossot    schedule 28.02.2014
comment
3.3.1 Предприятие...   -  person Vahid Rafiei    schedule 28.02.2014
comment
Кстати, я сделал собственный преобразователь (на Java), чтобы анализировать эту строку запроса и делать с ней что-то. Я не совсем уверен, почему оператор IN не работал   -  person Vahid Rafiei    schedule 28.02.2014
comment
Это ошибка сценария, а не ошибка JDBC: вы уверены, что seasonMbIds что-то содержит? Также это .join("',' ") будет производить '11',' 22',' 33'. Наконец, вы являетесь пользователем EE, поэтому вам следует использовать коннектор JDBC EE, который более функционален, чем коннектор CE. Также рассмотрите возможность обращения в профессиональную поддержку MuleSoft, поскольку вы используете EE.   -  person David Dossot    schedule 28.02.2014
comment
Это пространство в соединении было опечаткой в ​​редакторе stackoverflow. И да, SeasonMbIds — это обычный список, содержащий элементы. И я использую JDBC с разъемом EE. Тем не менее, я решил ее в другой форме. Нет необходимости звонить в службу поддержки прямо сейчас. Большое спасибо за ваш ответ и внимание :)   -  person Vahid Rafiei    schedule 28.02.2014


Ответы (1)


Использование Mule для более сложных вещей JDBC может быть очень, очень болезненным из-за ограниченных параметров форматирования запросов. Я знаю два варианта, которые у вас есть: 1) написать сценарий, который использует ваш коннектор jdbc для выполнения запроса, или 2) определить пользовательскую стратегию запроса для вашего коннектора jdbc. Вот простой хак, который вы можете сделать, чтобы этот единственный запрос работал с вариантом 2 (однако он нарушит все остальные запросы выбора...):

включите свой собственный класс Java:

<jdbc:connector name="Database" dataSource-ref="MySQL_Data_Source" validateConnections="true" queryTimeout="-1" pollingFrequency="0" doc:name="Database">
    <jdbc:sqlStatementStrategyFactory class="org.mule.transport.jdbc.sqlstrategy.MySqlStatementStrategyFactory"/>
</jdbc:connector>

напишите свой собственный фабричный класс Java:

package org.mule.transport.jdbc.sqlstrategy;

public class MySqlStatementStrategyFactory extends DefaultSqlStatementStrategyFactory {

  public MySqlStatementStrategyFactory()
  {
    super();
    selectSQLStrategy = new MySelectSqlStatementStrategy();
  }

}

Создайте свой класс стратегии и скопируйте исходный код для стратегии выбора по умолчанию из здесь

замените определение класса в скопированном исходном коде:

public  class MySelectSqlStatementStrategy extends SelectSqlStatementStrategy

найдите две строки, которые создают результат запроса, и замените его собственной реализацией, например:

result = connector.getQueryRunnerFor(endpoint).query(connection, readStmt.replace("?", (String)params[0]),
      connector.getResultSetHandler());
person Anton Kupias    schedule 28.02.2014
comment
Спасибо @Anton .. Я сделал собственный преобразователь (на Java), чтобы анализировать эту строку запроса и делать с ней что-то .. - person Vahid Rafiei; 28.02.2014