Groovy, как передать встроенные переменные, то есть оператор ${variable} из файла?

У меня есть интересная проблема в Groovy. Надеюсь, кто-нибудь может мне помочь.

В основном я использую Groovy Sql. Мне нужно выбрать несколько таблиц в разных базах данных. Мой второй запрос зависит от других запросов, например: "select * from table1-in-db1 where key = ${result-of-other-query1}, Groovy работает нормально, если я жестко закодировал это в функции. Однако моя проблема заключается в том, что sql определен в XML-файле, и после того, как я извлек его, передал в функцию в виде строки. он больше не взаимодействует со встроенным varialbe, даже у меня есть переменная с именем result-of-other-query1 в объеме.

Вот фрагмент кода sudo:

doQuery(String squery, String tquery) {

//query db1.
//squery = "select key1 from table1"
db1.rows(squery).each {row->

    //query db2.        
    //tquery ="select * where myKey ='${row.key1}'"
    println tquery

    tdb.rows(tquery).each { row1 ->
       .... // get error here, coz groovy did not replace ${row.key1}       
    }   
  }
}

Можно ли как-то сказать Groovy заменить встроенную переменную, даже если она передана в виде строки?

Большое спасибо за вашу помощь заранее

2 ответа

Пытаться

tquery = 'select * where myKey =:foo'

tdb.rows(tquery,[foo:"$row.key1"]).each

Вы также можете рассмотреть возможность использования eachRow, а не строк.(запрос).each

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

ОК - вот пример того, что я имею в виду. Я говорил о SimpleTemplateEngine ( http://groovy.codehaus.org/api/groovy/text/SimpleTemplateEngine.html).

Если вы загружаете строку из файла, это не будет gstring, это будет String, но вы можете использовать SimpleTemplateEngine для подстановки типа GString, например:

def clause='test'

String testString='this is a ${clause}'

println "As a string: " + testString

// Get an instance of the template engine
def engine = new groovy.text.SimpleTemplateEngine()

def template = engine.createTemplate(testString).make([clause:clause])
println template.toString()
Другие вопросы по тегам