我在Groovy中遇到了一个有趣的问题。希望可以有人帮帮我。
基本上我使用的是Groovy Sql。我需要在不同的数据库中选择多个表。我的第二个查询取决于其他查询,例如:"select * from table1-in-db1 where key = ${result-of-other-query1}
。如果我在函数中硬编码,Groovy工作正常。但是,我的问题是sql是在xml文件中定义的,之后我将retrieve作为字符串传入函数。它不再混合内联变量,即使我在范围内有一个名为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替换内联变量,即使它是作为字符串传入的?
非常感谢您的帮助
答案 0 :(得分:1)
尝试
tquery = 'select * where myKey =:foo'
tdb.rows(tquery,[foo:"$row.key1"]).each
您可能还想考虑使用eachRow而不是行。(查询).each
答案 1 :(得分:1)
我认为您需要的是简单的模板引擎。对不起,我在手机上,所以不能举个例子。 ..
好的 - 这是我的意思的一个例子。我在谈论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()