Grails:查询有很多关联

时间:2012-05-01 17:07:16

标签: grails gorm

我知道这个问题有几个问题,但似乎没有一个问题适合我。我有一个带有以下域对象的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,我相信这应该是可行的。

2 个答案:

答案 0 :(得分:1)

欢迎来到hibernate。

save方法通知持久化上下文应保存或更新实例。除非使用flush参数,否则不会立即保留该对象

如果您不使用flush,它会批量保存,因此当您在保存后立即设置查询时,似乎数据不存在。

你需要添加

 locations[it].save(failOnError: true, flush:true)

答案 1 :(得分:1)

您应该使用addTo*为一对多或多对多关系添加域类关系。

(2..4).each {
    locations[it].addToTags(tag)
}