2013-07-02 143 views
0

供參考,隨時爲此建議一個更好的標題。我有以下的領域模型(我們在這個沒有控制):GORM查詢多父母和子對象與父母的財產

class Foo { 
    int id 
    String baz 
    Date someDate 
    static hasMany = [bars:Bar] 
    static mapping = { 
     id composite: [ "id", "baz" ] 
    } 
} 

class Bar { 
    int id 
    String baz 
    Date someDate 
    Foo foo 
    static mapping = { 
     id composite: ["id", "baz", "someDate"] 
     columns { 
      foo([:]) { 
       column name: "id" 
       column name: "baz" 
      } 
     } 
    } 
} 

我的問題是:我有FOOS的名單,我需要找到所有的酒吧Foo.someDate == Bar.someDate,但只在一個查詢中,而不是每個Foo的查詢,不涉及延遲加載。同時設置Bars以提前獲取不是一種選擇。

例如,如果這是我的數據(僞代碼,我結合ID和巴茲成簡單的「ID」爲簡單起見):

[ 
    Foo (someDate:4/1/2013) 
     |___ bars: [{someDate:12/4/2012, id:1}, {someDate:4/1/2013, id:2}] 
    Foo (someDate:5/10/2012) 
     |___ bars: [{someDate:{4/1/2013, id:3} 
    Foo (someDate:3/3/2013) 
     |___ bars: [{someDate:3/3/2013, id:4}, {someDate:9/5/2013, id:5}] 
] 

我需要一個id爲2和4返回酒吧查詢。我真的不知道如何解決這個問題。

如果需要,它可能是HQL,但它最好是GORM查詢。

回答

1

試試這個:

Bar.executeQuery("select b from Bar b join b.foo as f where b.someDate = f.someDate and f in :fooList", [fooList: fooList]) 
+0

不是GORM,但它很簡單,完全符合我的需求。 –

-1

不知道它是這樣做的最佳方式,但我覺得雖然我已刪除了您的複合映射的約束,然後試了一下它會給你的結果

:)

Bar.executeQuery("select b.id from Bar b, Foo f where b.someDate = f.someDate") 

,工作對我來說:)

或使用其中的查詢:

def km = Bar.where { 
      foo.someDate==someDate 

     } 
println(km.list()) 

如果ALR伊迪已經FOO列表,則可以通過關閉的findAll過濾:

fooList.findAll{it.someDate in it.bars.someDate} 

:)

+0

這將查詢對所有FOOS雖然好嗎?我只希望它能查詢我目前擁有的列表。 –

+0

是的,我認爲它會查詢所有foos :) –

+0

好吧...不是我想要的。這可以修改爲僅使用現有的Foos列表進行查詢嗎? –