簡體   English   中英

Mule ESB,JDBC轉換器中的“ IN”運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM