我正在尝试创建一个执行大量数据库(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。
谢谢!
答案 0 :(得分:3)
Mule使用语句(来自java.sql),因此不支持以这种方式使用IN。 MEL-expression(#[])的每次出现都将被问号(?)替换,实际值将作为参数传递。我建议您通过动态构建查询并将其分配给JDBC连接器来解决此问题,并使用通用端点执行它。
创建一个这样的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();
}
}
在设置&#34; indices&#34;之后在流程中使用它flow var。
<component class="CustomQueryBuilder"/>
然后插入通用出站端点而不是jdbc出站端点,并引用创建的查询。
<outbound-endpoint exchange-pattern="request-response" address="jdbc://#[flowVars.generatedQueryKey]" />