【问题标题】:Grails Detached Criteria with Composite key使用复合键的 Grails 分离标准
【发布时间】:2015-01-02 09:16:09
【问题描述】:

域设置 .

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 个为研究填充的列表。 一个是当前与站点相关的资源列表 另一个是可与站点关联的可用资源列表。这些可用资源由 Active = true 且在与研究相同的 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 是如何工作的。如果有更好的方法来完成这个任务,请赐教!

【问题讨论】:

    标签: grails composite-key detachedcriteria createcriteria


    【解决方案1】:

    不需要标准生成器。这是我的解决方案:

    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])
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-12
      • 2017-05-29
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多