2012-05-01 46 views
0

我知道有关于这个问题的几个问题,但没有人似乎为我工作。我有一个Grails应用程序有以下域对象:的Grails:查询的hasMany关联

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个或多个标签的所有区域对象:

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,我相信在这里应该是可能的。

+1

'Location.count()'返回5?您可能需要为保存呼叫添加'flush:true'。 – doelleri

回答

1

欢迎冬眠。

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

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

你需要添加

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

废话......就是这样。感谢你的回答! – ShatyUT

1

您应该使用addTo*为增加了一个一对多或多对多一对多关系域类的关系。

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

感谢指针......我似乎总是忘记了addTo *方法。 – ShatyUT