2013-02-13 39 views
0

我试图创建一个REST服务,以JSON格式返回结果。createCriteria()

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

我遇到的问题是,它适用于该期间tradingName有效期为validFor,获取,不管当前日期/时间是否在期限与否的“有效”返回。

在JSON的示例中返回,它应该只带回第一names的,其他两个validFor脱落

findCentre方法的startend范围

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响应看起来像这样

[ 
{ 
    "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": "[email protected]" 
} 
] 

我认为问题出在findCentre方法中,但我目前缺乏Grails经验会导致我受挫。任何帮助,你可以给我将非常感激。

回答

1

你得到的结果是完全Centre对象 - 你限制你的搜索到那些当前名匹配的模式,但随后返回所有匹配的对象已经被不分日期已知的名字。

最简单的方法可能是后置滤波器,而标准的结果不仅仅是返回他们直接

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喜欢

[ 
    {"code":"1", 
    "names":["ABC"], 
    "email": "[email protected]" 
    } 
] 
+0

感谢伊恩。这很好。我知道它返回整个'Centre'对象,但我会认为'validFor {和{le(“start”,new Date())ge(“end”,new Date())}}'part createCriteria()会过滤正确的结果。请你能解释一下这一点吗?对不起,对Grails来说全新的。 – 2013-02-14 08:06:21

+1

@GarethLewis在条件查询的条件仅是限制的方式,其对象从数据库中选择,但每个选定的对象返回全部 - 在SQL方面他们是WHERE子句,但不影响什么选择。你可以使用'projection'块来定义SELECT,但是我不能想出一个方法来做你需要的投影,这就是我提出后期过滤的原因。 – 2013-02-14 09:10:04

+0

再次感谢。我明白你在说什么。将仅查看“预测”信息。 – 2013-02-14 09:46:17