2012-03-26 7 views
0

Ich versuche, einen Flow in Mule zu erstellen, die Abfragen in einer Tabelle mit einer dynamischen Where-Anweisung ermöglichen. Die Idee ist, eine Karte von Parametern mit null oder mehr Einträge zu senden und dann eine Abfrage-Zeichenfolge daraus zu erstellen.Sehr dynamische JDBC-Abfrage in Mule

Ich benutze hsqldb zum Testen und bekomme einige seltsame Fehler über unerwartete Token. Hier

ist der Fluss:

<script:transformer name="extractParameters"> 
    <script:script file="extractParameters.groovy" engine="groovy"/> 
</script:transformer> 

<flow name="datafetch.flow"> 
    <vm:inbound-endpoint address="vm://datafetch" exchange-pattern="request-response"/> 
    <enricher target="#[variable:where-statement]"> 
    <transformer ref="extractParameters"/> 
    </enricher> 
    <jdbc:outbound-endpoint connector-ref="datasource" 
          queryKey="parameterized-select" 
          exchange-pattern="request-response" 
          mimeType="text/plain"> 
    <jdbc:query key="parameterized-select" 
     value="select * from ${datasource.table} #[variable:where-statement]"/> 
    </jdbc:outbound-endpoint> 
    <json:object-to-json-transformer name="CaseInsensitiveHashMapToJson"/> 
</flow> 

Der enricher ist ein starkes Skript, das eine json-Struktur an die Where-Anweisungszeichenfolge konvertiert:

import groovy.json.JsonSlurper 

def input = new JsonSlurper().parseText(payload) 
def parameters = input?.get("parameters") 
def result = "" 
if(parameters==null) return result 

def where = parameters.inject([]) { list, entry -> list << "${entry.key}=${entry.value}"}.join(" AND ") 
if (where.isEmpty()) return result 

result = "where " + where 
return result 

empty Parameter resultieren in der Anreicherungs Senden Herstellung eine leere Zeichenfolge, und die Fehler sind:

1. unexpected token: ? (org.hsqldb.HsqlException) 
    org.hsqldb.error.Error:-1 (null) 
2. unexpected token: ?(SQL Code: -5581, SQL State: + 42581) (java.sql.SQLSyntaxErrorException) 
    org.hsqldb.jdbc.Util:-1 (null) 
3. unexpected token: ? Query: select * from TABLE1 ? Parameters: [](SQL Code: -5581, SQL State: + 42581) (java.sql.SQLException) 
    org.apache.commons.dbutils.QueryRunner:540 (null) 

Senden eines Parameters (C1 = 0) Führt zur enricher Herstellung der String „wobei C1 = 0“, und die Fehler sind:

1. unexpected token: ? (org.hsqldb.HsqlException) 
    org.hsqldb.error.Error:-1 (null) 
2. unexpected token: ?(SQL Code: -5581, SQL State: + 42581) (java.sql.SQLSyntaxErrorException) 
    org.hsqldb.jdbc.Util:-1 (null) 
3. unexpected token: ? Query: select * from TABLE1 ? Parameters: [where C1=0](SQL Code: -5581, SQL State: + 42581) (java.sql.SQLException) 
    org.apache.commons.dbutils.QueryRunner:540 (null) 

So sieht es aus wie die Abfrage etwas anderes als ein String erwartet, wo ich also #[variable:where-statement]

geschrieben , was muss ich in die Variable where-statement eingeben, damit dies funktioniert? Oder gibt es eine andere Möglichkeit, dies zu spezifizieren?

+0

, dass es tatsächlich funktioniert Fand heraus, wenn ich die uri-basierten Endpunktversion anstelle des transportspezifischen Endpunkt wie folgt verwenden : '' – hdohlmann

+0

kann ich nicht bekommen Der oben genannte Tag validiert in mule studio. Es scheint einen QueryKey attr zu erfordern. (edit: version: 3.4.0) – Rondo

+0

immer noch keine Freude ... Ich habe Rondo

Antwort

2

tryed ich auf diese Weise, und es funktioniert:

<scripting:transformer doc:name="Groovy"> 
     <scripting:script engine="Groovy"><![CDATA[def q ="select * from myTable where 1=1 "; 
if(payload.containsKey('param1')) q = q + " And mycolumn = " + payload.param1; 

payload.put('dynamicWhere', q); 
return payload;]]></scripting:script> 
    </scripting:transformer> 
<outbound-endpoint exchange-pattern="request-response" connector-ref="ConnectorDb" doc:name="Database" address="jdbc://#[payload.dynamicWhere]" /> 

...