2

我在 Groovy 中有一个有趣的问题。希望可以有人帮帮我。

基本上我使用的是 Groovy Sql。我需要在不同的数据库中选择多个表。我的第二个查询取决于其他查询,例如:"select * from table1-in-db1 where key = ${result-of-other-query1}. 如果我在函数中对其进行硬编码,Groovy 可以正常工作。但是,我的问题是 sql 是在 xml 文件中定义的,并且在我检索后作为字符串传递到函数中。它不再与内联变量交互,即使我确实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 替换内联变量,即使它是作为字符串传入的?

非常感谢您提前提供的帮助

4

2 回答 2

1

尝试

tquery = 'select * where myKey =:foo'

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

您可能还需要考虑使用 eachRow 而不是 rows.(query).each

于 2013-06-16T09:39:16.467 回答
1

我认为您需要的是简单的模板引擎。对不起,我在手机上,所以不能给你举个例子。..

好的 - 这是我的意思的一个例子。我在谈论 SimpleTemplateEngine ( http://groovy.codehaus.org/api/groovy/text/SimpleTemplateEngine.html )。

如果您从文件加载字符串,它将不是 gstring,而是字符串,但您可以使用 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()
于 2013-06-16T20:53:50.687 回答