Очень динамический JDBC-запрос в Mule - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь создать поток в Mule, который разрешает запросы в таблице с динамическим оператором where. Идея состоит в том, чтобы отправить карту параметров с нулевым или большим количеством записей, а затем построить строку запроса из этого.

Я использую hsqldb для тестирования и получаю некоторые странные ошибки о неожиданном токене.

Вот поток:

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

enricher - это отличный скрипт, который преобразует json-структуру в строку where:

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

Отправка пустых параметров приводит к тому, что обогащение создает пустую строку, а ошибки:

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)

Отправка одного параметра (C1 = 0) приводит к тому, что обогащение создает строку «где C1 = 0», а ошибки:

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)

Итак, похоже, что запрос ожидает что-то еще, кроме строки, в которой я написал #[variable:where-statement]

Итак, что мне нужно ввести в переменную where-statement, чтобы эта работа работала? Или есть другой способ указать это?

1 Ответ

2 голосов
/ 02 июля 2014

Я попробовал этот способ, и он работает:

<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]" />

...

...