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