[英]Mule ESB, “IN” operator within a JDBC transformer
讓我們想象一下我想將列表傳遞到JDBC轉換器中。
例如,我在流中創建列表:
<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)
可能存在一些逃避問題。 我使用了不同的分隔符,問題仍然存在...
有什么建議嗎?
由於查詢格式化選項有限,因此將Mule用於更高級的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();
}
}
創建策略類,並從此處復制默認選擇策略的源代碼
替換復制的源代碼中的類定義:
public class MySelectSqlStatementStrategy extends SelectSqlStatementStrategy
找到創建查詢結果的兩行並用您自己的實現替換,例如:
result = connector.getQueryRunnerFor(endpoint).query(connection, readStmt.replace("?", (String)params[0]),
connector.getResultSetHandler());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.