0

この件に関していくつかの質問があることは知っていますが、どれもうまくいかないようです。次の Domain オブジェクトを持つ Grails アプリがあります。

class Tag {
    String name
}

class SystemTag extends Tag {
    // Will have additional properties here...just placeholder for now
}

class Location {
    String name
    Set<Tag> tags = []
    static hasMany = [tags: Tag]
}

1 つ以上のタグでタグ付けされたすべての Location オブジェクトを照会しようとしています。

class LocationQueryTests {

    @Test
    public void testTagsQuery() {
        def tag = new SystemTag(name: "My Locations").save(failOnError: true)
        def locationNames = ["L1","L2","L3","L4","L5"]
        def locations = []
        locationNames.each {
            locations << new Location(name: it).save(failOnError: true)
        }
        (2..4).each {
            locations[it].tags << tag
            locations[it].save(failOnError: true)
        }

        def results = Location.withCriteria {
            tags {
                'in'('name', [tag.name])
            }
        }

        assertEquals(3, results.size())     // Returning 0 results
    }
}

データが正しく作成/設定されていることを確認しました...5 つの場所オブジェクトが作成され、最後の 3 つがタグ付けされています。

上記のクエリの何が問題なのかわかりません。私は本当にHQLから離れたいと思っており、ここではそれが可能であるべきだと信じています.

4

2 に答える 2

1

addTo*1 対多または多対多の関係のドメイン クラスの関係を追加するために使用する必要があります。

(2..4).each {
    locations[it].addToTags(tag)
}
于 2012-05-01T18:26:05.070 に答える
1

冬眠へようこそ。

save メソッドは、インスタンスを保存または更新する必要があることを永続化コンテキストに通知します。フラッシュ引数が使用されない限り、オブジェクトはすぐには永続化されません

フラッシュを使用しない場合、保存はバッチで行われるため、保存直後にクエリをセットアップすると、データが存在しないように見えます。

追加する必要があります

 locations[it].save(failOnError: true, flush:true)
于 2012-05-01T18:17:19.543 に答える