我正在尝试创建一个执行大量DB(Microsoft SQL Server 2008 DB)操作的m子流。
我执行的第一个数据库查询返回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。
谢谢!
Mule使用语句(来自java.sql),因此不支持以这种方式使用IN。每次出现的MEL表达式(#[])都将替换为问号(?),并且实际值将作为参数传递。我建议您通过动态构建查询并将其分配给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();
}
}
设置“索引”流变量后,请在流中使用它。
<component class="CustomQueryBuilder"/>
然后插入通用出站终结点而不是jdbc出站终结点,并引用创建的查询。
<outbound-endpoint exchange-pattern="request-response" address="jdbc://#[flowVars.generatedQueryKey]" />
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句