-1

好的,我想在这里为所有人节省一些时间,我猜这不是最聪明的方法。所以在这里我得到了我正在做的事情。请慢慢来,因为我刚出生在圣杯世界。让我知道我的方法没问题,或者是否有更聪明的方法。

我有两张表 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 {
}

将 abc 与 def 映射的规则存储在 AbcDefMapping 中。一个这样的规则可能是当 abc.firstAbc 为“jack”时,将“jacky”存储在 def.fieldA 中。在这种情况下,映射的值将是 inputTable = abc inputField = firstAbc inputValue = “jack” outputTable = def outputField = fieldA outputValue = “jacky”</p>

我想在 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


}
4

1 回答 1

0

Controller.groovy模板实际上是一个巨大的字符串。这意味着其中的任何内容${}都会被评估并替换到字符串中。

很难猜出你实际上想要做什么。你目前拥有的:

def f = 5
def inputs = ${className.substring(0,f)}.list()

将尝试生成与之匹配的代码,但没有变量f,只有一个读取的字符串,def f = 5它将最终出现在生成的控制器中。当您实际使用 value5时,可以正确评估 GString 中的表达式。

于 2012-09-05T16:42:47.277 回答