Mule Sql Query - 将参数传递给IN运算符

时间:2014-06-14 20:43:41

标签: sql mule

我正在尝试创建一个执行大量数据库(Microsoft SQL Server 2008数据库)操作的骡流。

我做的第一个数据库查询返回一个ID列表

select id from first_table;

我通过构建ArrayList的Java转换器运行有效负载: [1,2,3,4,5] 然后将其另存为变量索引

然后我尝试在另一个查询中使用此数组

select * from another_table where first_table_fk in (#[flowVars.indices]);

但无论我做什么,我都会不断收到错误

不支持从UNKNOWN到UNKNOWN的转换。

使用IN运算符时,Mule无法处理java.util.ArrayList(或常规数组,int [])。

然后我尝试将整个查询创建为字符串变量(然后在其中引用它)。

此结果有一个例外: java.lang.IllegalArgumentException:找不到SQL语句的SQL策略:#[flowVars.queryString]

你能帮我解决一下我的问题(在Mule sql查询中使用IN运算符)吗?

我正在使用Mule studio 3.4.0 CE。

谢谢!

1 个答案:

答案 0 :(得分:3)

Mule使用语句(来自java.sql),因此不支持以这种方式使用IN。 MEL-expression(#[])的每次出现都将被问号(?)替换,实际值将作为参数传递。我建议您通过动态构建查询并将其分配给JDBC连接器来解决此问题,并使用通用端点执行它。

  1. 创建一个这样的Java类:

    public class CustomQueryBuilder implements Callable {
        @Override
        public Object onCall(MuleEventContext eventContext) throws Exception {
            JdbcConnector c = (JdbcConnector) eventContext.getMuleContext().getRegistry().lookupConnector("JDBC_connector");
    
            StringBuilder query = new StringBuilder();
            String queryBase = "select * from another_table where first_table_fk in (";
            query.append(queryBase);
    
            int numIndices = ((ArrayList<Integer>)eventContext.getMessage().getInvocationProperty("indices")).size();
            ArrayList<String> indices = new ArrayList<String>();
            for(int i=0; i<numIndices; i++) {
                    indices.add("#[flowVars.indices[" + i + "]");
            }
            query.append(StringUtils.join(indices, ", "));
            query.append(")");
    
            String finalQuery = query.toString();
    
            MessageDigest md = MessageDigest.getInstance("MD5");
            String queryDigest = String.format("%1$032X",new BigInteger(1, md.digest(finalQuery.getBytes("UTF-8"))));
    
            if (!c.getQueries().containsKey(queryDigest)) {
                    c.getQueries().put(queryDigest, finalQuery);
            }
    
            eventContext.getMessage().setInvocationProperty("generatedQueryKey", queryDigest);
    
            return eventContext.getMessage();
        }
    }
    
  2. 在设置&#34; indices&#34;之后在流程中使用它flow var。

    <component class="CustomQueryBuilder"/>
    
  3. 然后插入通用出站端点而不是jdbc出站端点,并引用创建的查询。

    <outbound-endpoint exchange-pattern="request-response" address="jdbc://#[flowVars.generatedQueryKey]" />