2012-05-01 76 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