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