我有两张桌子abc和def。我想根据一些规则将数据从abc移动到def。对于我的项目,我期待将来有几个这样的情况(映射表klm与xyz,pqr与jkl等等),因此需要进行泛化)。
Abc和Def类如下所示
class Abc {
String firstAbc
String secondAbc
static constraints = {
firstAbc(nullable:true)
secondAbc(nullable:true)
}
}
class Def {
String fieldA
String someRandomField
static constraints = {
}
}
我创建了一个名为Mappings的域类(将作为所有未来映射的父级),如下所示
class Mappings {
String inputTable // in this case this will be abc
String inputField // can be firstAbc or secondAbc
String inputValue // some value
String outputTable // def in this case
String outputField // either of fieldA or someRandomField
String outputValue
}
然后我扩展Mappings以创建我的特定实例AbcDefMapping,如下所示
class AbcDefMapping extends Mappings {
}
使用def映射abc的规则存储在AbcDefMapping中。一个这样的规则可能是当abc.firstAbc是“jack”时,在def.fieldA中存储“jacky”。在这种情况下映射的值将是 inputTable = abc inputField = firstAbc inputValue =“jack” outputTable = def outputField = fieldA outputValue =“jacky”
我想在Controller.groovy中添加一个名为transform()的方法来完成所需的操作,以便将来我只创建域类,映射类并生成控制器。这就是我的变换方法到目前为止的样子。但我无法继续,直到我解决了手头的问题。如果我解决了这个问题,也许我会进入下一步。你们都知道,过去几天苦苦挣扎
def transform(){
def csplit = []
def count = 0
for (i in ${className}){
if (i == i.toUpperCase() && count!=0){
csplit.add(count)
}
count++
}
def inputs = ${className.substring(0,3)}.list() // here instead of manually inserting 3, I need to insert csplit[0].length
def inputTable = ${className}.substring(0,1).toLowerCase() + ${className}.substring(1,3) //replace 3 with csplit[0].length
def mappings = ${className}.executeQuery(" from ${className} acm where acm.inputTable = '" + inputTable + "' order by acm.inputField, acm.inputValue, acm.outputField, acm.outputValue")
println mappings
}
答案 0 :(得分:0)
Controller.groovy
模板实际上是一个巨大的字符串。这意味着评估${}
中的任何内容并将其替换为字符串。
很难猜出你真正想要做什么。你现在有什么:
def f = 5
def inputs = ${className.substring(0,f)}.list()
将尝试生成与之匹配的代码,但没有变量f
,只有一个读取def f = 5
的字符串,它将在生成的控制器中结束。当您实际使用值5
时,可以正确评估GString中的表达式。