2014-02-25 91 views
0

我正在向Grails環境介紹自己(它是真棒)。我一直在收穫動態生成方法的好處,如findAllBy*範圍。但是,我遇到了一個問題,我不確定如何繼續。在Google上花費的一小時對我來說也沒有那麼多。查找列表中包含值的所有對象

問題

我有一類這樣的:

class Runner { 

    static hasMany = [owners: Owner] 
} 

而在我的所有者控制器,我希望能夠找到所有Runner對象,包含給定Owner。實際上,我試圖從manyone

如果我有一個Owner對象,看起來像

Owner[name="Dave"] 

而且我有一個Runner的東西,如:

Runner[owners[Owner[name="Dave"], Owner[name="James"]]] 

我的查詢應該返回這個Runner對象,但不應該返回

Runner[owners[Owner[name="Bill"], Owner[name="James"]]] 

我嘗試

我已經嘗試使用inList擴展,但經過一些進一步的研究,我意識到,是專爲周圍的其他方法。我此刻的代碼如下:

def runners() { 
    log.info("Runners") 
    List<Runner> runners; 
    Owner owner; 

    if (params.id) { 
     log.info("Id = " + params.id); 
     owner = Owner.get(params.id); 
     log.info("owner = " + owner.name); 
     // Grab runners in list thing. 
     log.info("Number of results = " + runners.size()); 
    } 


    [results: results, jockeyInstance: jockey] 
} 
+0

[Grails:我如何通過hasMany關係中的孩子搜索?](http:// stackoverflow。com/questions/2437446/grails-how-can-i-search-through-children-in-a-hasmany-relationship) –

+0

你有什麼問題與'inList'有關?應該爲這種情況工作 –

+0

'inList',根據文檔是另一種方式。因爲當我傳入'List'時,如果類中的元素在List中,則返回它。 – christopher

回答

3

經過對HQL的一些研究,我發現了一個更優雅的解決方案,根本不需要我改變Domain類。我使用的查詢如下:

runners = Runner.executeQuery("FROM Runner as r WHERE :owner in elements(r.owners)", [owner : ownerInstance]); 

哪裏ownerInstance是用來映射到RunnerOwner對象。

+0

我用我的答案中的代碼嘗試了它,它像廣告一樣工作。這應該被認爲是答案。 – cfrick

1

也許得不到答案爲手頭上的問題,但你也可以讓知道業主的選手這樣

class Runner { 
      String name 
      static hasMany = [ owners: Owner ] 
      static belongsTo = Owner 
    } 


    class Owner { 
      String name 
      static hasMany = [ runners: Runner ] 
    } 

    Owner o1 = new Owner(name: "O1").save() 
    Owner o2 = new Owner(name: "O2").save() 
    Owner o3 = new Owner(name: "O3").save() 
    new Runner(name: "R1").with{ 
      addToOwners(o1) 
      addToOwners(o2) 
      save() 
    } 
    new Runner(name: "R2").with{ 
      addToOwners(o1) 
      addToOwners(o3) 
      save() 
    } 
    print o3.runners 

結果[runnerowner.Runner : 2]

+0

這絕對是* one *選項,所以+1。 – christopher

0

這是你期待的東西嗎?

def results = Runner.withCriteria { 
    owners { 
     eq 'name', 'Dave' 
     //idEq params.id //If id of owner is provided 
    } 
} 

假設你有

class Runner { 
    static hasMany = [owners: Owner] 
} 

class Owner { 
    String name 
} 

這裏是一個sample你可以試試。

相關問題