回答

收藏

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

技术问答 技术问答 85 人阅读 | 0 人回复 | 2023-09-13

我正在尝试创建一个执行许多DB(Microsoft SQL Server 2008 DB)操作的m子流。
, f$ k, X9 ~5 K6 ?8 C0 T我执行的第一个数据库查询返回ID列表
- Z- S0 o. G- q  f5 Uselect id from first_table;
& G3 d% J3 d' R/ K4 d( G$ I" `我通过构建ArrayList的Java转换器运行有效负载:[1,2,3,4,5],然后将其另存为变量 索引* s$ |* f) I. G
然后我尝试在另一个查询中使用此数组
# Z" H7 Z$ J7 a5 \# xselect * from another_table where first_table_fk in (#[flowVars.indices]);
0 t" W, U+ J% ]* m# f, D3 d但是,无论我做什么,我都会不断收到错误消息5 A8 p9 q; ^8 |
不支持从UNKNOWN到UNKNOWN的转换。0 `# e0 @% T/ C, \7 a4 o$ i- y7 n* ]3 u
使用IN运算符时,Mule无法处理java.util.ArrayList(或常规数组int [])。2 R3 j0 _0 j( a$ z* e& X
然后,我尝试将整个查询创建为字符串变量(然后在中引用它)。& \  D* B9 p0 b
结果将发生以下异常:java.lang.IllegalArgumentException:未为以下SQL语句找到SQL策略:#[flowVars.queryString]
5 ]( v2 ^$ Q; j3 e- b/ @8 d您能帮我解决我的问题吗(在Mule sql查询中使用IN运算符)?, n5 s  \5 ]+ Q
我正在使用Mule studio 3.4.0 CE。
3 ~. N* \+ ]5 h谢谢!3 g/ r" L* h$ W
                . i6 }. Y# {' x. ]1 G# t
解决方案:1 E; s$ ]. p8 u
               
6 T* U" \  x% A; ]) [0 {3 }, @% o/ y; P6 q, k
$ @: \: H8 Z: j
                Mule使用语句(来自java.sql),因此不支持以这种方式使用IN。每次出现的MEL表达式(#[])都将替换为问号(?),并且实际值将作为参数传递。我建议您通过动态构建查询并将其分配给JDBC连接器并使用通用端点执行它来解决此问题。
: |2 u: H1 [4 A0 k  \; c[ol]
  q7 ]) |" E, Z4 |% Q7 c创建一个这样的Java类:1 j% }$ A0 e7 L! N9 R9 t  n
public class CustomQueryBuilder implements Callable {
1 o$ n) Q+ f( T  z( {@Override
- U4 l8 f8 d" C* f1 [! |# k: c# mpublic Object onCall(MuleEventContext eventContext) throws Exception {
4 d! O( E' s; M  M* }    JdbcConnector c = (JdbcConnector) eventContext.getMuleContext().getRegistry().lookupConnector("JDBC_connector");
6 p& N$ ^+ ?% V& J    StringBuilder query = new StringBuilder();
; O$ U1 X5 e# U4 Q7 k3 e( I    String queryBase = "select * from another_table where first_table_fk in (";  c8 X" y4 b1 Z0 R, [
    query.append(queryBase);
' R0 K+ h/ G) V6 X1 F    int numIndices = ((ArrayList[I])eventContext.getMessage().getInvocationProperty("indices")).size();
- f3 P* x; \4 ?0 w0 E    ArrayList indices = new ArrayList();! E0 Z  ?' j2 Y$ ?: i
    for(int i=0; i}
* F" @3 m8 c5 B5 m* U1 a3 r& ?, n* Q) L
设置“索引”流变量后,请在流中使用它。4 Z+ G! L% T. n8 D( W* Q$ c0 E

- ~9 H" ?5 e& P$ {; r
3 g4 n, m/ @, J& O然后插入通用出站终结点而不是jdbc出站终结点,并引用创建的查询。4 f5 d* d2 _! O5 N! o* a

' ^" D# A& t( z( J2 Y* j
" Y. T/ L5 K  E8 Y3 T( K% w[/ol]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则