2010-11-02 62 views
2

我有一组相关类似这样的领域对象:我怎么能指“这个”对象在一个Grails条件查询

class Book { 
    static belongsTo = [author: Author] 
} 

class Contract { 
    static belongsTo = [author: Author] 
    Book book 
} 

class Author { 
    static hasMany = [books: Book, contracts: Contract] 
} 

我想创建一个连接对所有查询一本书的作者合同,其中合同书是“这本书”。我想回答的问题是“合同下的所有书籍是什么?”在这里我有什么为标准,但我不知道如何来指代“这个”对象:

Book.createCriteria().list() { 
    author { 
     contracts { 
      eqProperty('book', '??') // what here?? 
     } 
    } 
} 

可以参考我的“这个”对象或以某种方式为它创建一个别名?

+0

这可能是有用的,以及HTTP:// adhockery。 blogspot.com/2009/04/associations-and-criteria-queries.html – 2010-11-03 08:48:24

回答

1

没有写一个单元测试,但我认为你可以做到这一点..

GORM Documentation向下滚动到渴望获取的例子来看看例子

Book.createCriteria().list() { 
    author { 
     contracts { 
      eqProperty('book.id', book.id) // what here?? 
     } 
    } 
} 
+0

关闭,但这并不按我希望的方式工作。 'eqProperty'有两个属性名称。我可以使用'eq'来找到一本特定的书,但我试图让它加入书和书之间的连接。 – ataylor 2010-11-03 16:11:50

+0

@ataylor是否尝试使用'eq'而不是'eqProperty' – 2010-11-03 17:06:54

+0

这也没有奏效。这不是一本我想找的具体书,而是我想参加书桌。谢谢你的建议。 – ataylor 2010-11-03 17:45:40

0

而不是使用标准建造的,是直接HQL的一个选项?我不是最流畅的HQL,但也许你可以这样做:

// should return a collection of Books 
Contract.executeQuery('select distinct c.book from Contract c') 

如果你需要它是特定作者,您可以添加一个where子句相应(docs)。

+0

这是一种可能性,但我还没有想出如何将[HQL查询链接在一起](http://www.grails.org/doc/latest/ref/Domain%20Classes/namedQueries.html),如条件查询,以及我非常喜欢这个功能。 – ataylor 2010-11-03 18:23:13

0

没有在这台机器上运行的grails版本,我无法测试它的语法。

您可能能够做这样的事情: 添加“导入org.hibernate.FetchMode为FM”到控制器或服务

Contract.withCriteria{ 
    createAlias('book','b') 
    fetchMode('book',FM.EAGER) 
}.book.unique()