2014-02-28 69 views
0

讓我們的影像,我想傳遞一個列表到JDBC變壓器。騾子ESB,一個JDBC變壓器內的「IN」操作符

舉例來說,我在流創建列表:

<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) 

有一些逃避的問題,也許。我用不同的分隔符和問題依然存在......

什麼建議嗎?

+0

什麼版本您使用的BTW?我看到'#[有效負載:]'所以我想的是3.2或更高版本?否則,這將是'#[message.payload]'... –

+0

「3.3.1企業」 ...... –

+0

BTW,我做(在Java中)的自定義變壓器來解析該查詢字符串,並做的東西與它。我'不太清楚爲什麼IN操作員不工作 –

回答

1

使用騾子更先進的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(); 
    } 

} 

創建您的策略類,並從here

[R複製源代碼默認選擇策略E將類定義在複製的源代碼:

public class MySelectSqlStatementStrategy extends SelectSqlStatementStrategy 

發現創建查詢結果,並用自己的實現來替代,例如兩行:

result = connector.getQueryRunnerFor(endpoint).query(connection, readStmt.replace("?", (String)params[0]), 
     connector.getResultSetHandler()); 
+0

謝謝@Anton ..我做了一個自定義轉換器(在Java中)來解析查詢字符串,並做它的東西.. –