わかりました、ここにいるすべての人のために時間を節約したかったのですが、それは最も賢明な方法ではなかったと思います. だからここで私は私がやっていることを手に入れました。私は聖杯の世界に生まれたばかりなので、ゆっくりしてください。私のアプローチが大丈夫か、またはよりスマートな方法があるかどうかを教えてください。
abc と def の 2 つのテーブルがあります。いくつかのルールに基づいて、データを 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 に格納されます。そのようなルールの 1 つは、abc.firstAbc が「jack」の場合、「jacky」を def.fieldA に保存することです。この場合のマッピングの値は、inputTable = abc inputField = firstAbc inputValue = "jack" outputTable = def outputField = fieldA outputValue = "jacky" になります。</p>
必要な処理を行う transform() というメソッドを Controller.groovy に追加したいので、将来はドメイン クラスを作成し、クラスをマッピングして、コントローラーを生成します。これは、これまでのところ、私の変換方法がどのように見えるかです。しかし、当面の問題を解決するまで、これ以上進むことはできません。この問題を解決できれば、次のステップに進むことができるかもしれません。ご存知のように、ここ数日は苦労しました
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
}