2

IDを持っている以前に永続化されたオブジェクトを、最初に取得しなくても更新できるようにしたいと思います。私が避けようとしている主なことは、オブジェクトがデータベースから取得されたときに、オブジェクトのフィールドに複数の値をコピーする必要があることです。これらの値はフィールド名に対応するキーを持つマップにあるので、マップを引数としてコンストラクターを介してオブジェクトを作成するのは簡単です。残念ながら、この方法で作成されたオブジェクトは、idフィールドが既存のレコードのIDフィールドに設定されていても、保存すると新しいデータベースレコードになります。

私は現在、 Groovyクラスのプロパティをコピーするために、ここに示されている例の1つにわずかなバリエーションを使用していますが、複数の理由から、あまり洗練されたソリューションではありません。

基本的に私はこのようなことをしたいと思っています:

class Foo {
    int a
    String b
}

def data = [id: 99, a: 11, b: "bar"]    //99 is the id of an existing record
def foo = new Foo(data)
foo.update()    //or some other comparable persistence mechanism

ありがとう

4

2 に答える 2

3

GORM ドメイン クラスでexecuteUpdate メソッドを使用できます。

Foo.executeUpdate("update Foo f set f.a=:a, f.b=:b where f.id=:id", data)
于 2012-11-13T08:13:15.840 に答える
3

マップ キーがオブジェクト プロパティと同じ名前である限り、次のようなクロージャまたは関数で個々のプロパティ名を指定せずに executeUpdate を使用できます。

def updateString = { obj, map ->
        def str = ""
        map.each { key, value ->
            str += "${obj}.${key}=:${key},"
        }

        return str[0..-2]
    }

    def data= [foo:"bar", machoMan:"RandySavage"]

この場合、 をprintln updateString("f", data)返します"f.foo=:foo,f.machoMan=:machoMan"

次に、これを行うことができます:

Foo.executeUpdate("update Foo f set ${updateString("f", data)}", data)

もちろん、これらすべてを 1 つのクロージャーまたは関数に結合することもできます。

于 2012-11-14T18:41:04.500 に答える