2017-12-18 100 views
1

我什麼時候能得到父母的ID的許多一對多的關係表site_sections有以下欄目:如何使用多態關聯

id 
site_id 
section_id 

這是用來sectionssites表之間的連接表。所以一個網站有很多部分和一個部分可在許多網站Sites表具有以下列:

id 
store_number 

sites_sections表是與parameters表多態性相關聯地使用。

我想找到它的store_number對應網站的欄目特定網站的所有參數。是否有可能在site_settings.id數組通過使用IN子句SQL中,這樣的事情:

Parameter.where("parent_id IN (" + [1, 2, 3, 4] + ") and parent_type ='com.models.SiteSection'"); 

其中[1, 2, 3, 4]應該是一組ID從sites_sections表或有更好的解決方案嗎?

+0

我想我找到了解決辦法: – belgoros

+0

1.查找store_number網站:'網站aSite = Site.findFirst(」 store_number =?「,STORE_NUMBER); 2.找到'SitesSettings'列表中找到網站,包括'Parameters':'名單 siteSections = SiteSection.where( 「?SITE_ID =」,aSite.get( 「ID」))包括(Parameter.class) ;' 3.然後在'site_settings'上循環並獲取相應的'parameters':'(SiteSection siteSection:siteSections){List siteParams = siteSection.getAll(Parameter.class);' 4. Loop on Parameters:'對於(參數siteParam:siteParams){'並找到需要的值。 – belgoros

回答

0

你的解決方案是正確的:

Site aSite = Site.findFirst("store_number=?", STORE_NUMBER); 
List<SiteSection> siteSections= SiteSection.where("site_id=?", aSite.getId()).include(Parameter.class); 
for (SiteSection siteSection : siteSections) { 
    List<Parameter> siteParams = siteSection.getAll(Parameter.class); 
    for (Parameter siteParam : siteParams) { ... } 
} 

此外,通過使用include(),你也避免了N + 1問題:http://javalite.io/lazy_and_eager#improve-efficiency-with-eager-loading

但是可以有一個陷阱。如果您有大量的參數,那麼您將使用大量內存,因爲include()會立即將所有結果加載到堆中。如果結果集相對較小,則通過運行單個查詢節省資源。如果結果集很大,則會浪費堆空間。

見文檔:LazyList#include()

邊注:使用aSite.getId()aSite.getLongId()代替aSite.get("id")

+0

非常感謝Igor,一個很酷的功能'getId'; 'getLongId',不知道那個:)。當沒有找到記錄時,是否可以將JSON轉換爲錯誤? ' 其中'notFound'方法只返回'返回 「發現所提供的商店還沒有任何網站:」 – belgoros

+0

其實我從控制器'響應(NOTFOUND(參數( 「storeNumber」)))返回+ storeNumber;' – belgoros

+0

肯定,不要忘記設置狀態代碼:'響應(消息).STATUS(404);',不要忘記測試,你甚至有一個參數:'如果(!空(「storeNumber」))'... – ipolevoy