2014-11-06 51 views
0

Domain Setup 。帶複合鍵的Grails Detached標準

Study { 
    Long id 
    String name 
    Site site 
    USState state 
    ... 
} 

Site { 
    Long id 
    String name 
    ... 
} 

Resource { 
    Long id 
    String name 
    Boolean active 
    USState state 
    ... 
} 

SiteResource { 
    id composite: ['site', 'resource'] 
    Site site 
    Resource resource 
} 

我有2個列表,爲研究填充。 其中一個是當前關聯到該網站的資源的列表 另一個是可以關聯到該網站的可用資源的列表。這些可用資源是由正在積極=真正的和相同的USState內,研究

我想寫一個標準來得到這個工作,但似乎無法得到它確定。我需要證明是有效的所有資源,在同一USState的研究,而不是當前與站點(目前協會是第一個表)

return Resource.createCriteria().list(sort: params.sort, order: params.order, max: params.max, offset: params.offset) { 
     if (params.searchText) { 
      ilike("name", "%${params.searchText}%") 
     } 

     eq("usState", params.state) 
     eq("active", true) 

     ne "id" , new DetachedCriteria(SiteResource).build { 
      'in' ("resource", params.associatedResources.resource.id) 
      'in' ("site", params.associatedResources.site.id) 
     } 
    } 

相關的我也試過如下:

def siteResources = getSiteResourcesBySite(site).collect { 
    it.resource 
} 

def resources = resource.findAllByRefugeAndActiveNotInList(refuge, true, siteResources, [sort:"name"]) 

return resources.list(sort: params.sort, order: params.order, max: params.max, offset: params.offset) 

我希望這是有意義的;我仍然試圖找出DetachedQuery的工作原理。如果有更好的方法來完成這個任務,請賜教!

回答

0

不需要標準生成器。這裏是我的解決方案:

def site = siteService.getSite(params.siteId) 
def stateCode = site.study.state.code 
def state= State.findByCode(stateCode) 

List<Resource> associatedResources = siteResourceService.getAssociatedResourcesBySite(site).collect { it.id } 

params.state = state 
params.site = site 

...

def getUnassociatedResourcesByState(params, List associatedResources) { 
    params.max = Math.min(params.max ? Integer.parseInt(params.max) : 25, 100) 
    params.offset = params.offset ? params.offset : 0 
    params.sort = params.sort ? params.sort : 'name' 
    params.order = params.order == 'desc' ? params.order : 'asc' 

    return Resource.findAllByStateAndActiveAndIdNotInList(params.state, true, associatedResources, [sort: params.sort, order: params.order, max: params.max, offset: params.offset]) 
}