2010-03-13 57 views
15

如果我有一個客戶端域類,並且該客戶端有許多課程。我如何找到我要找的課程?例如:Grails:我如何通過hasMany關係搜索兒童?

class Client { 
    String name 
    static hasMany = [courses:Course] 
} 

class Course { 
    String name 
    static belongsTo = [client:Client] 
} 

def client = Client.get(1) 

我想在該課程關係中「查找」或「搜索」。也許是這樣的:

client.courses.find(name:'Whatever') 

有沒有辦法與Grails做到這一點?

回答

27

如果您使用的是二級緩存,並已對這個關聯配置它,你可能要遍歷集合(這會爲你節省數據庫查詢,如果該協會是在高速緩存)。

下面是一個使用巧妙Groovy Collection API一個例子:

def course = client.courses.find { it.name == "whatever" } 

重要提示:如果您決定採取這種方法確保的coursesconfigure eager/batch fetching,這樣你就不會遇到the n+1 problem

+0

這種方法比下一個更好嗎? – 2013-12-10 07:00:28

+0

這取決於你的用例。你應該避免使用關聯,如果它可以不受限制地增長,但對於僅限於少數實體的關聯(<10?),這可能對許多用例來說很好。 – Kimble 2013-12-10 09:55:53

+0

我會建議將搜索代碼封裝在服務方法或域類本身中(作爲getter方法),以便您可以輕鬆地用真實世界的數據在基準測試中嘗試不同的實現。 – Tobia 2015-06-17 07:51:26

12

一種方法是用動態finder方法:

Courses.findAllByClientAndName(client, 'whatever') 

這將讓所有客戶端的課程名爲「什麼」。

的Grails也有few other ways做到這一點。

+0

如果你沒有belongsTo設置,你會怎麼做? – monksy 2015-04-27 18:14:07

+1

您可以改爲在連接列上查詢。例如'findAllByClientIdAndName',如果'Course'對象具有'clientId'屬性。這取決於你的域如何表達兩個對象之間的關係。 – ataylor 2015-04-27 18:33:05