首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >createCriteria()

createCriteria()
EN

Stack Overflow用户
提问于 2013-02-13 10:24:30
回答 1查看 541关注 0票数 0

我正在尝试创建一个REST服务,它以JSON格式返回结果。

我创建了一个返回搜索结果的方法。它接受搜索参数的EnumMap,并根据这些参数进行检查以构建createCriteria。

我遇到的问题是,无论当前的日期/时间是否在“有效的”期间中,应用于validFor tradingName 有效期间的都会被返回。

在返回的JSON示例中,它应该只返回第一个names,因为另外两个validFor超出了startend范围

findCentre方法

代码语言:javascript
复制
def findCentre(EnumMap searchParams) {

    def c = Centre.createCriteria()
    def results = c.listDistinct {
        if(searchParams.containsKey(CENTRE_SEARCH_PARAMETERS.START_CENTRE_CODE_RANGE) && searchParams.containsKey(CENTRE_SEARCH_PARAMETERS.END_CENTRE_CODE_RANGE)) {
            between("code", searchParams.get(CENTRE_SEARCH_PARAMETERS.START_CENTRE_CODE_RANGE), searchParams.get(CENTRE_SEARCH_PARAMETERS.END_CENTRE_CODE_RANGE))
        }

        if(searchParams.containsKey(CENTRE_SEARCH_PARAMETERS.CENTRE_CODE_PARTIAL)) {
            like("code", "%" + searchParams.get(CENTRE_SEARCH_PARAMETERS.CENTRE_CODE_PARTIAL) + "%")
        }

        if(searchParams.containsKey(CENTRE_SEARCH_PARAMETERS.INDIVIDUAL_CENTRE_CODE)) {
            eq("code", searchParams.get(CENTRE_SEARCH_PARAMETERS.INDIVIDUAL_CENTRE_CODE))
        }

        if(searchParams.containsKey(CENTRE_SEARCH_PARAMETERS.CENTRE_NAME_PARTIAL)) {
            names {
                ilike("tradingName", "%" + searchParams.get(CENTRE_SEARCH_PARAMETERS.CENTRE_NAME_PARTIAL) + "%")
                validFor {
                    and {
                        le("start", new Date())
                        ge("end", new Date())
                    }
                }
            }
        }
    }
    results
}

我得到的JSON响应如下

代码语言:javascript
复制
[
{
    "code": "1",
    "names": [
        {
            "trading_name": "ABC",
            "valid_time": {
                "start": "2013-02-13T08:54:31Z",
                "end": "2018-02-12T08:54:31Z"
            }
        },
        {
            "trading_name": "ABCDEF",
            "valid_time": {
                "start": "2013-03-31T23:00:00Z",
                "end": "2013-12-31T00:00:00Z"
            }
        },
        {
            "trading_name": "DEF",
            "valid_time": {
                "start": "2013-03-31T23:00:00Z",
                "end": "2013-12-31T00:00:00Z"
            }
        }
    ],
    "email": "blah@blah.com"
}
]

我认为问题在findCentre方法中,但是我目前缺乏Grails的经验导致了我的挫折。你能给我的任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-13 16:47:02

返回的结果是完整的Centre对象--将搜索限制在当前名称与模式匹配的对象上,但随后返回匹配对象的所有名称,无论日期如何。

最简单的方法可能是对标准结果进行后过滤,而不是直接返回它们。

代码语言:javascript
复制
Date now = new Date()
return results.collect { res ->
  [code: res.code,
   names: res.names.findAll { it.start <= now && it.end >= now }*.tradingName,
   email: res.email ]
}

这应该给你JSON类似的

代码语言:javascript
复制
[
  {"code":"1",
   "names":["ABC"],
   "email": "blah@blah.com"
  }
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14851324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档