2013-07-02 485 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列表进行查询吗? –