2011-11-05 304 views
0

在我的應用程序的請求中,我經常獲得應該關聯的對象的ID。不過,我必須執行檢查,看看他們是否。如何檢查對象是否在Domain對象的集合中?

示例方案: A類和B相關:

A { 
    static hasMany = [bs: B] 
} 

在我的請求,我將得到援助和競價。 我最常做的是:

def a = A.get(aid) 
def b = a.bs.find {it.id == bid} 

什麼會是一個更好的辦法,使這個檢查?從性能角度來看?

感謝

回答

0

如果B有一個屬於關聯= [A:A]在它定義的,那麼你可以這樣做:

def a = A.get(aid) 
def b = B.find("from B as b where b.id=:id and b.a = :a", [id:bid, a:a]) 
if (b) { 
    // b exists -- do something with it here 
} else { 
    // uh oh! b isn't within a 
} 

過像你的代碼的所有元素集合這不會做一個迭代。本質上,它與erturne的解決方案相同,但實際上加載了該對象。

+0

謝謝託德。我盡力避免雙向聯想。這主要是由於它在大多數情況下會是多對多的,而我只需要一種方式。但在兩種情況下,這似乎是一個好主意。如果b.idA ==有幫助,那麼執行B.get(bid)可能會更快,並執行檢查[在需要時不需要抓取A就可以完成)。 – Krystian

+0

這就是grails的美妙之處,有十幾種方法可以處理任何事情!我的建議是,用最簡單,最簡單的方式閱讀代碼,只有在發現實際性能問題時纔對其進行優化。使用分析工具可以幫助找到真正的問題點,並且優化後的代碼通常不太容易理解,所以我只是觸及導致最多延遲的區域,以使我的代碼更易於維護。 – Todd

0

我的第一個傾向是下降到HQL和使用計數()來查看它是否存在。可能有更優雅的方式來達到同樣的事情(可能使用withCriteria),但我第一次嘗試在它看起來像:

def result = A.executeQuery("select count(*) from A as a inner join a.bs as b where a.id=:aid and b.id=:bid", [aid: aid, bid: bid]) 
def associated = result[0] > 0 

我認爲這將是非常有效的,但任何時候你正在尋找提高性能是最好對不同的實現進行測量,以便您可以自己比較它們。我將把它作爲讀者的練習。 ;-)

編輯:我認爲它是有效的,因爲我已經離開了數據庫中的繁重工作,而不是通過網絡拉取A和B實例的數據,在內存中創建實例或迭代結果。

+0

我想我舉的例子有點太簡單了,它讓你覺得我所追求的只是檢查它是否存在。我也希望得到這個對象,找到會返回它。我現在要修改這個問題。謝謝你的回答,雖然 – Krystian